home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / xb / xb2.has < prev    next >
Text File  |  1997-03-05  |  50KB  |  3,677 lines

  1.  
  2. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3. *
  4. *    xb2.has  ……   ぺけ-BASICのインタプリタ本体
  5. *
  6. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  7.  
  8.  
  9.     .include    doscall.mac
  10.     .include    iocscall.mac
  11.     .include    fefunc.h
  12.  
  13.     .include    variable.h
  14.  
  15.     .xref    error
  16.     .xref    errors
  17.     .xref    dec_print
  18.     .xref    init_tpal
  19.     .xref    endendend
  20.  
  21.     .xref    I行数算出
  22.  
  23.     .xref    _breakflag
  24.  
  25.  
  26.  
  27.  
  28. IERROR    .macro    num
  29.     bsr    I行数算出
  30.     moveq    #num,d0
  31.     bra    error
  32.     .endm
  33.  
  34. IERRORS    .macro    num
  35.     bsr    I行数算出
  36.     moveq    #num,d0
  37.     bra    errors
  38.     .endm
  39.  
  40.  
  41.  
  42.     .offset    0
  43. Aint:        .ds.l    1
  44. Astr:        .ds.l    1
  45. Afloat:        .ds.l    1
  46. Achar:        .ds.l    1
  47. orgSP:        .ds.l    1
  48. orgstrbuf:    .ds.l    1
  49. Adim:
  50.  
  51.  
  52.  
  53.  
  54.     .text
  55.     .even
  56.     .xdef    basic_exec
  57. basic_exec:
  58.     movea.l    sp,a3        * AUTO 用
  59.  
  60.     movea.l    4+変数INIT,a0
  61.     adda.w    (a5)+,a0    * 変数確保リストの先頭アドレス
  62.     move.w    4+8(a0),d0    * 配列の個数 - 1
  63.     lsl.w    #2,d0
  64.     add.w    #Adim+4,d0    * Adim + 配列の個数 * 4
  65.     movea.l    sp,a1
  66.     suba.w    d0,sp        * auto 変数のハンドルを収める領域を確保
  67.     movea.l    sp,a4
  68.     move.l    a1,orgSP(a4)
  69.     lea.l    _SP上限(a6),a1
  70.     cmpa.l    a1,sp
  71.     bcs    stack_over
  72.  
  73.  
  74.     move.l    a3,-(sp)    * 保存&パラメーター渡し
  75.     tst.b    d7
  76.     bmi    auto_vc
  77.  
  78.     lea.l    Adim(a4),a1
  79.     move.l    a1,配列
  80.     move.l    a1,-(sp)
  81.     pea.l    変数float
  82.     pea.l    変数char
  83.     pea.l    変数str
  84.     pea.l    変数int
  85.     bra    @f
  86. auto_vc:
  87.     pea.l    Adim(a4)
  88.     pea.l    Afloat(a4)
  89.     pea.l    Achar(a4)
  90.     pea.l    Astr(a4)
  91.     pea.l    Aint(a4)
  92. @@:
  93.     bsr    Variable_clr_sub    * 変数領域確保 & 引き数セット
  94.     lea.l    4*5(sp),sp
  95.     movea.l    (sp)+,a3
  96.  
  97.  
  98.  
  99.     move.l    strbuf,orgstrbuf(a4)
  100.     .xdef    main_loop
  101. main_loop:
  102.     move.l    orgstrbuf(a4),strbuf
  103.  
  104.     move.w    _breakflag(pc),d0
  105.     beq    @f
  106.     btst    #breakoffF,d7
  107.     beq    Stop
  108. @@:
  109.     move.w    (a5)+,d4
  110.     bmi    式
  111.     beq    関数呼び出し
  112. statement:
  113.     move.w    stt(pc,d4.w),d4
  114.     jmp    stt(pc,d4.w)
  115. stt:
  116.     .dc.w    関数呼び出し-stt    *
  117.     .dc.w    Color-stt
  118.     .dc.w    Console-stt
  119.     .dc.w    Locate-stt
  120.     .dc.w    Lprint-stt
  121.     .dc.w    Print-stt
  122.     .dc.w    Width-stt
  123.     .dc.w    Screen-stt
  124.     .dc.w    Break-stt
  125.     .dc.w    Case-stt    *
  126.     .dc.w    Continue-stt        *10
  127.     .dc.w    Default-stt    *
  128.     .dc.w    Endfunc-stt
  129.     .dc.w    Switch2-stt
  130.     .dc.w    Error-stt
  131.     .dc.w    Return-stt
  132.     .dc.w    Switch-stt
  133.     .dc.w    Beep-stt
  134.     .dc.w    Cls-stt
  135.     .dc.w    End-stt
  136.     .dc.w    Endwhile-stt        *20
  137.     .dc.w    Exit-stt
  138.     .dc.w    For-stt
  139.     .dc.w    Gosub-stt    *
  140.     .dc.w    Goto-stt
  141.     .dc.w    If-stt
  142.     .dc.w    Input-stt
  143.     .dc.w    Key-stt
  144.     .dc.w    Linput-stt
  145.     .dc.w    Next-stt
  146.     .dc.w    Next2-stt        *30
  147.     .dc.w    Stop-stt
  148.     .dc.w    Until-stt
  149.     .dc.w    While-stt
  150.     .dc.w    Dim-stt
  151.     .dc.w    ColorP-stt    * 35
  152.     .dc.w    FuncKey-stt    * 36
  153.     .dc.w    CursorSW-stt    * 37
  154.     .dc.w    Str-stt        * 38
  155.     .dc.w    Func-stt
  156.     .dc.w    Else-stt        *40
  157.     .dc.w    SysVar-stt        *41
  158.     .dc.w    Ifeq-stt        *42
  159.     .dc.w    Ifne-stt
  160.     .dc.w    Iflt-stt
  161.     .dc.w    Ifgt-stt
  162.     .dc.w    Ifle-stt
  163.     .dc.w    Ifge-stt        *47
  164.  
  165.  
  166.  
  167. 関数呼び出し:
  168.     bsr    function_call
  169.     bra    main_loop
  170.  
  171.  
  172.  
  173.  
  174.  * 代入式だった
  175. 式:
  176.     btst    #14,d4
  177.     beq    普通変数への代入
  178.  
  179.  
  180.  
  181. 配列への代入:
  182.  * d4.b = 代入先の型
  183.     bsr    値get        * 値を得る
  184.     move.l    d0,d2
  185.     move.l    d1,d3
  186.     movea.l    a0,a1
  187.     bsr    dim_set_sub        * d2-d5/a1 保存
  188.  
  189.     tst.b    d4
  190.     beq    int_setD
  191.     bmi    float_setD
  192.     subq.b    #1,d4
  193.     beq    str_setD
  194. *char_setD:
  195.     move.b    d2,(a0,d0.l)
  196.     bra    main_loop
  197.  
  198. str_setD:
  199.     lsl.l    #8,d0
  200.     lea.l    (a0,d0.l),a0
  201. @@:
  202.     move.b    (a1)+,(a0)+
  203.     bne    @b
  204.     bra    main_loop
  205.  
  206. float_setD:
  207. .ifdef    _XB030
  208.     movem.l    d2-d3,(a0,d0.l*8)
  209. .else
  210.     lsl.l    #3,d0
  211.     movem.l    d2-d3,(a0,d0.l)
  212. .endif
  213.     bra    main_loop
  214.  
  215. int_setD:
  216. .ifdef    _XB030
  217.     move.l    d2,(a0,d0.l*4)
  218. .else
  219.     lsl.l    #2,d0
  220.     move.l    d2,(a0,d0.l)
  221. .endif
  222.     bra    main_loop
  223.  
  224.  
  225.  
  226.  
  227.  
  228. 普通変数への代入:
  229.  * d4.b = 代入先の型
  230.     bsr    値get        * 値を得る
  231.     move.w    (a5)+,d2    * 代入先の変数番号
  232.     bmi    auto変数set
  233.  
  234.     tst.b    d4
  235.     beq    int_set
  236.     bmi    float_set
  237.     subq.b    #1,d4
  238.     beq    str_set
  239. *char_set:
  240.     movea.l    変数char,a1        * とりあえず兼用
  241.     move.b    d0,(a1,d2.w)
  242.     bra    main_loop
  243.  
  244. float_set:
  245.     movea.l    変数float,a1        * とりあえず兼用
  246. .ifdef    _XB030
  247.     movem.l    d0-d1,(a1,d2.w*8)
  248. .else
  249.     lsl.w    #3,d2
  250.     movem.l    d0-d1,(a1,d2.w)
  251. .endif
  252.     bra    main_loop
  253.  
  254. str_set:
  255.     movea.l    変数str,a1        * とりあえず兼用
  256.     lsl.w    #8,d2
  257.     lea.l    (a1,d2.w),a1
  258. @@:
  259.     move.b    (a0)+,(a1)+
  260.     bne    @b
  261.     bra    main_loop
  262.  
  263. int_set:
  264.     movea.l    変数int,a1        * とりあえず兼用
  265. .ifdef    _XB030
  266.     move.l    d0,(a1,d2.w*4)
  267. .else
  268.     lsl.w    #2,d2
  269.     move.l    d0,(a1,d2.w)
  270. .endif
  271.     bra    main_loop
  272.  
  273.  
  274.  
  275. auto変数set:
  276.     not.w    d2
  277.  
  278.     tst.b    d4
  279.     beq    int_setA
  280.     bmi    float_setA
  281.     subq.b    #1,d4
  282.     beq    str_setA
  283. *char_set:
  284.     movea.l    Achar(a4),a1
  285.     move.b    d0,(a1,d2.w)
  286.     bra    main_loop
  287.  
  288. float_setA:
  289.     movea.l    Afloat(a4),a1
  290. .ifdef    _XB030
  291.     movem.l    d0-d1,(a1,d2.w*8)
  292. .else
  293.     lsl.w    #3,d2
  294.     movem.l    d0-d1,(a1,d2.w)
  295. .endif
  296.     bra    main_loop
  297.  
  298. str_setA:
  299.     movea.l    Astr(a4),a1
  300.     lsl.w    #8,d2
  301.     lea.l    (a1,d2.w),a1
  302. @@:
  303.     move.b    (a0)+,(a1)+
  304.     bne    @b
  305.     bra    main_loop
  306.  
  307. int_setA:
  308.     movea.l    Aint(a4),a1
  309. .ifdef    _XB030
  310.     move.l    d0,(a1,d2.w*4)
  311. .else
  312.     lsl.w    #2,d2
  313.     move.l    d0,(a1,d2.w)
  314. .endif
  315.     bra    main_loop
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325. stack_over:
  326.     IERROR    8
  327.  
  328.  
  329. **    **    **    main_loop 部分終わり    **    **    **    **
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357. **    **    **    **    **    **    **    **    **
  358. float値get:
  359.     moveq    #-1,d4
  360.     bra    値get
  361. str値get:
  362.     moveq    #1,d4
  363.  
  364.  * (d4.b) 型の数式を評価して、( (d1/)d2-d4/a1 保存 )
  365.  * int の時、    d0    に値を返す
  366.  * float    d0-d1
  367.  * str        a0
  368. 値get:                    * どこかで d4.l を破壊している
  369.     move.w    (a5)+,d0
  370.     tst.b    d0
  371.     beq    ig111
  372.     bmi    fg111
  373.     cmpi.b    #2,d0
  374.     beq    cg111
  375. *sg111:
  376.     cmpi.b    #1,d4
  377.     bne    型違い
  378.     move.w    d4,-(sp)
  379.     move.l    d1,-(sp)
  380.     bsr    str_get0
  381.     move.l    (sp)+,d1
  382.     move.w    (sp)+,d4
  383.     rts
  384.  
  385. cg111:
  386.     tst.w    d0
  387.     bmi    1f
  388.     btst    #14,d0
  389.     bne    char_val
  390.     bsr    int_cal        * int でいい
  391.     bra    @f        **
  392. 1:
  393.     bclr    #14,d0
  394.     beq    char_imm
  395. *char_fnc:
  396.     movem.l    d1-d4/a1,-(sp)
  397.     bsr    function_call
  398.     movem.l    (sp)+,d1-d4/a1
  399.     tst.w    (a0)
  400.     bne    返り値がない
  401.     move.l    2+4(a0),d0
  402.     bra    4f
  403.  
  404. char_val:
  405.     btst    #13,d0
  406.     bne    char_dim
  407.  
  408.     btst    #12,d0
  409.     bne    str_point
  410.  
  411.     btst    #8,d0
  412.     beq    1f
  413.     movea.l    Achar(a4),a0
  414.     bra    2f
  415. 1:
  416.     movea.l    変数char,a0        * とりあえず兼用
  417. 2:
  418.     move.w    (a5)+,d0
  419.     move.b    (a0,d0.w),d0
  420.     bra    4f
  421.  
  422.  
  423.  
  424. char_dim:
  425.     move.l    d1,-(sp)
  426.     bsr    dim_sub
  427.     move.l    (sp)+,d1
  428.     move.b    (a0,d0.l),d0
  429.     bra    4f
  430.  
  431.  
  432. str_point:
  433.     btst    #8,d0
  434.     bne    1f
  435.  
  436.     bsr    int値get
  437.     movea.l    変数str,a0        * とりあえず兼用
  438.     bra    2f
  439. 1:
  440.     bsr    int値get
  441.     movea.l    Astr(a4),a0
  442. 2:
  443.     cmpi.w    #$100,d0
  444.     bcc    str_access_err
  445.     move.l    d1,-(sp)
  446.     move.w    (a5)+,d1
  447.     lsl.w    #8,d1
  448.     add.w    d0,d1
  449.     move.b    (a0,d1.w),d0
  450.  
  451.     move.l    (sp)+,d1
  452.     bra    4f
  453.  
  454.  
  455. char_imm:
  456.     move.l    (a5)+,d0
  457. *    bra    4f
  458.  
  459. 4:
  460.     andi.l    #$000000ff,d0    * char
  461.     bra    @f
  462.  
  463.  
  464.  
  465.  
  466. ig111:
  467.     tst.w    d0
  468.     bmi    1f
  469.     bclr    #14,d0
  470.     bne    int_val
  471.     bsr    int_cal
  472.     bra    @f
  473.  
  474. int_val:
  475.     btst    #13,d0
  476.     bne    int_dim
  477.  
  478.     btst    #8,d0
  479.     bne    auto_int_val
  480.     move.w    (a5)+,d0
  481.     bge    normal_int_var
  482.     bsr    int_system_var
  483.     bra    @f
  484. 1:
  485.     bclr    #14,d0
  486.     beq    int_imm
  487. int_fnc:
  488.     movem.l    d1-d4/a1,-(sp)
  489.     bsr    function_call
  490.     movem.l    (sp)+,d1-d4/a1
  491.     tst.w    (a0)
  492.     bne    返り値がない
  493.     move.l    2+4(a0),d0
  494.     bra    @f
  495.  
  496.  
  497. normal_int_var:
  498.     movea.l    変数int,a0        * とりあえず兼用
  499. .ifdef    _XB030
  500.     move.l    (a0,d0.w*4),d0
  501. .else
  502.     lsl.w    #2,d0
  503.     move.l    (a0,d0.w),d0
  504. .endif
  505.     bra    @f
  506. auto_int_val:
  507.     move.w    (a5)+,d0
  508.     movea.l    Aint(a4),a0
  509. .ifdef    _XB030
  510.     move.l    (a0,d0.w*4),d0
  511. .else
  512.     lsl.w    #2,d0
  513.     move.l    (a0,d0.w),d0
  514. .endif
  515.     bra    @f
  516.  
  517.  
  518. int_dim:
  519.     move.l    d1,-(sp)
  520.     bsr    dim_sub
  521.     move.l    (sp)+,d1
  522. .ifdef    _XB030
  523.     move.l    (a0,d0.l*4),d0
  524. .else
  525.     lsl.l    #2,d0
  526.     move.l    (a0,d0.l),d0
  527. .endif
  528.     bra    @f
  529.  
  530. int_imm:
  531.     move.l    (a5)+,d0
  532. *    bra    @f
  533.  
  534.  
  535.  
  536. @@:
  537.     tst.b    d4
  538.     beq    ig111_ok
  539.     bmi    float_trans
  540.     cmpi.b    #1,d4
  541.     beq    型違い        * str
  542. *    andi.l    #$000000ff,d0    * char
  543. ig111_ok:
  544.     rts            * int,char 同士
  545. float_trans:
  546.     FPACK    __LTOD        * float <- int,char
  547.     rts
  548.  
  549.  
  550.  
  551. fg111:
  552.     move.l    d1,-(sp)    *
  553.     move.w    d4,-(sp)
  554.     bsr    float_get0
  555.     move.w    (sp)+,d4
  556.     tst.b    d4
  557.     beq    int_trans
  558.     bmi    fl_ok
  559.     cmpi.b    #1,d4
  560.     beq    型違い
  561.     FPACK    __DTOL        * char <- float
  562.     andi.l    #$ff,d0
  563.     move.l    (sp)+,d1
  564.     rts
  565. int_trans:
  566.     FPACK    __DTOL        * int <- float
  567.     move.l    (sp)+,d1
  568.     rts
  569. fl_ok:
  570.     addq.l    #4,sp        * float 同士
  571.     rts
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579. int値get:                * d4.l 保存!!
  580.     move.w    (a5)+,d0
  581.     tst.b    d0
  582.     beq    ig112
  583.     bmi    fg112
  584.     cmpi.b    #2,d0
  585.     bne    型違い
  586. *cg112:
  587.     tst.w    d0
  588.     bmi    1f
  589.     btst    #14,d0
  590.     bne    char_val2
  591.     bsr    int_cal        * int でいい
  592.     rts
  593. *    bra    4f
  594. 1:
  595.     bclr    #14,d0
  596.     beq    char_imm2
  597. *char_fnc2:
  598.     movem.l    d1-d4/a1,-(sp)
  599.     bsr    function_call
  600.     movem.l    (sp)+,d1-d4/a1
  601.     tst.w    (a0)
  602.     bne    返り値がない
  603.     move.l    2+4(a0),d0
  604.     bra    4f
  605.  
  606. char_val2:
  607.     btst    #13,d0
  608.     bne    char_dim2
  609.  
  610.     btst    #12,d0
  611.     bne    str_point2
  612.  
  613.     btst    #8,d0
  614.     beq    1f
  615.     movea.l    Achar(a4),a0
  616.     bra    2f
  617. 1:
  618.     movea.l    変数char,a0        * とりあえず兼用
  619. 2:
  620.     move.w    (a5)+,d0
  621.     move.b    (a0,d0.w),d0
  622.     bra    4f
  623.  
  624.  
  625.  
  626. char_dim2:
  627.     move.l    d1,-(sp)
  628.     bsr    dim_sub
  629.     move.l    (sp)+,d1
  630.     move.b    (a0,d0.l),d0
  631.     bra    4f
  632.  
  633.  
  634. str_point2:
  635.     btst    #8,d0
  636.     bne    1f
  637.  
  638.     bsr    int値get
  639.     movea.l    変数str,a0        * とりあえず兼用
  640.     bra    2f
  641. 1:
  642.     bsr    int値get
  643.     movea.l    Astr(a4),a0
  644. 2:
  645.     move.l    d1,-(sp)
  646.     cmpi.w    #$100,d0
  647.     bcc    str_access_err
  648.     move.w    (a5)+,d1
  649.     lsl.w    #8,d1
  650.     add.w    d0,d1
  651.     move.b    (a0,d1.w),d0
  652.  
  653.     move.l    (sp)+,d1
  654.     bra    4f
  655.  
  656.  
  657. char_imm2:
  658.     move.l    (a5)+,d0
  659. *    bra    4f
  660.  
  661. 4:
  662.     andi.l    #$000000ff,d0    * char
  663.     rts
  664.  
  665.  
  666.  
  667.  
  668. ig112:
  669.     tst.w    d0
  670.     bmi    1f
  671.     bclr    #14,d0
  672.     bne    int_val2
  673.     bsr    int_cal
  674.     rts
  675.  
  676. int_val2:
  677.     btst    #13,d0
  678.     bne    int_dim2
  679.  
  680.     btst    #8,d0
  681.     bne    auto_int_val2
  682.     move.w    (a5)+,d0
  683.     bge    normal_int_var2
  684.     bra    int_system_var
  685.     *bsr    int_system_var
  686.     *rts
  687. 1:
  688.     bclr    #14,d0
  689.     beq    int_imm2
  690. int_fnc2:
  691.     movem.l    d1-d4/a1,-(sp)
  692.     bsr    function_call
  693.     movem.l    (sp)+,d1-d4/a1
  694.     tst.w    (a0)
  695.     bne    返り値がない
  696.     move.l    2+4(a0),d0
  697.     rts
  698.  
  699.  
  700. normal_int_var2:
  701.     movea.l    変数int,a0        * とりあえず兼用
  702. .ifdef    _XB030
  703.     move.l    (a0,d0.w*4),d0
  704. .else
  705.     lsl.w    #2,d0
  706.     move.l    (a0,d0.w),d0
  707. .endif
  708.     rts
  709. auto_int_val2:
  710.     move.w    (a5)+,d0
  711.     movea.l    Aint(a4),a0
  712. .ifdef    _XB030
  713.     move.l    (a0,d0.w*4),d0
  714. .else
  715.     lsl.w    #2,d0
  716.     move.l    (a0,d0.w),d0
  717. .endif
  718.     rts
  719.  
  720.  
  721. int_dim2:
  722.     move.l    d1,-(sp)
  723.     bsr    dim_sub
  724.     move.l    (sp)+,d1
  725. .ifdef    _XB030
  726.     move.l    (a0,d0.l*4),d0
  727. .else
  728.     lsl.l    #2,d0
  729.     move.l    (a0,d0.l),d0
  730. .endif
  731.     rts
  732.  
  733. int_imm2:
  734.     move.l    (a5)+,d0
  735.     rts
  736.  
  737.  
  738.  
  739. fg112:
  740.     move.l    d1,-(sp)    *
  741.     move.w    d4,-(sp)
  742.     bsr    float_get0
  743.     move.w    (sp)+,d4
  744.     FPACK    __DTOL        * int <- float
  745.     move.l    (sp)+,d1
  746.     rts
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754. 型違い:
  755.     IERROR    31
  756. 返り値がない:
  757.     IERROR    49
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769. *    *    *    *    *    *    *    *
  770.  
  771. float_get0:
  772.     tst.w    d0
  773.     bmi    fg1
  774.     btst    #14,d0
  775.     beq    float_cal
  776.  
  777.  * float_val
  778.     btst    #13,d0
  779.     bne    float_dim
  780.  
  781.     btst    #8,d0
  782.     beq    1f
  783.     movea.l    Afloat(a4),a0
  784.     bra    2f
  785. 1:
  786.     movea.l    変数float,a0        * とりあえず兼用
  787. 2:
  788.     move.w    (a5)+,d0
  789.     lsl.w    #3,d0
  790.     movem.l    (a0,d0.w),d0-d1
  791.     rts
  792.  
  793.  
  794.  
  795. float_dim:
  796.     bsr    dim_sub
  797.     lsl.l    #3,d0
  798.     movem.l    (a0,d0.l),d0-d1
  799.     rts
  800.  
  801.  
  802.  
  803. fg1:
  804.     bclr    #14,d0
  805.     beq    float_imm
  806.  * float_fnc
  807.     movem.l    d2-d4/a1,-(sp)
  808.     bsr    function_call
  809.     movem.l    (sp)+,d2-d4/a1
  810.     tst.w    (a0)
  811.     bne    返り値がない
  812.     movem.l    2(a0),d0-d1
  813.     rts
  814.  
  815.  
  816. float_imm:
  817.     movem.l    (a5)+,d0/d1
  818.     rts
  819.  
  820.  
  821. float_cal:
  822.     movem.l    d2-d3,-(sp)
  823.  
  824.     move.w    (a5)+,d0
  825. *    add.w    d0,d0
  826.     move.w    fc(pc,d0.w),d0
  827.     jmp    fc(pc,d0.w)
  828. fc:
  829.     .dc.w    0    * dummy
  830.     .dc.w    Fmul-fc
  831.     .dc.w    Fdiv-fc
  832.     .dc.w    Fdiv2-fc
  833.     .dc.w    Fmod-fc
  834.     .dc.w    Fadd-fc
  835.     .dc.w    Fsub-fc
  836.     .dc.w    Fshr-fc
  837.     .dc.w    Fshl-fc
  838.     .dc.w    Fequal-fc
  839.     .dc.w    Fnoteq-fc
  840.     .dc.w    Fsmall-fc
  841.     .dc.w    Flarge-fc
  842.     .dc.w    Feq_small-fc
  843.     .dc.w    Feq_large-fc
  844.     .dc.w    Fnot-fc
  845.     .dc.w    Fand-fc
  846.     .dc.w    FFor-fc
  847.     .dc.w    Fxor-fc
  848.     .dc.w    Fminus-fc
  849.  
  850. Fmul:
  851.     bsr    float値get
  852.     move.l    d0,d2
  853.     move.l    d1,d3
  854.     bsr    float値get
  855.     FPACK    __DMUL        * 手抜き
  856.     bra    float_cal_end
  857. Fdiv:
  858.     bsr    float値get
  859.     move.l    d0,d2
  860.     move.l    d1,d3
  861.     bsr    float値get
  862.     exg.l    d0,d2
  863.     exg.l    d1,d3
  864.     FPACK    __DDIV        * 手抜き
  865.     bra    float_cal_end
  866. Fdiv2:
  867.     bsr    float値get
  868.     FPACK    __DTOL
  869.     move.l    d0,d2
  870.     bsr    float値get
  871.     FPACK    __DTOL
  872.     move.l    d0,d1
  873.     move.l    d2,d0
  874.     FPACK    __LDIV        * 手抜き
  875.     FPACK    __LTOD
  876.     bra    float_cal_end
  877. Fmod:
  878.     bsr    float値get
  879.     FPACK    __DTOL
  880.     move.l    d0,d2
  881.     bsr    float値get
  882.     FPACK    __DTOL
  883.     move.l    d0,d1
  884.     move.l    d2,d0
  885.     FPACK    __LMOD        * 手抜き
  886.     FPACK    __LTOD
  887.     bra    float_cal_end
  888.  
  889. Fadd:
  890.     bsr    float値get
  891.     move.l    d0,d2
  892.     move.l    d1,d3
  893.     bsr    float値get
  894.     FPACK    __DADD        * 手抜き
  895.     bra    float_cal_end
  896. Fsub:
  897.     bsr    float値get
  898.     move.l    d0,d2
  899.     move.l    d1,d3
  900.     bsr    float値get
  901.     exg.l    d0,d2
  902.     exg.l    d1,d3
  903.     FPACK    __DSUB        * 手抜き
  904.     bra    float_cal_end
  905.  
  906. Fminus:
  907.     bsr    float値get
  908.     bchg    #31,d0        * 符号反転
  909.     bra    float_cal_end
  910.  
  911. Fequal:
  912. Fnoteq:
  913. Fsmall:
  914. Flarge:
  915. Feq_small:
  916. Feq_large:
  917. Fshr:
  918. Fshl:
  919. Fnot:
  920. Fand:
  921. FFor:
  922. Fxor:
  923.     .xdef    floatにない演算
  924. floatにない演算:
  925.     IERROR    2
  926.  
  927.  
  928. float_cal_end:
  929.     movem.l    (sp)+,d2-d3
  930.     rts
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937. **    **    **    **    **    **
  938.  
  939. str_get0:
  940.     tst.w    d0
  941.     bmi    sg1
  942.     btst    #14,d0
  943.     beq    str_cal
  944.  
  945.  * str_val
  946.     btst    #13,d0
  947.     bne    str_dim
  948.  
  949.     btst    #8,d0
  950.     bne    auto_str_var
  951.  
  952.     move.w    (a5)+,d0
  953.     bge    normal_str_var
  954.  * str_system_var
  955.     add.w    d0,d0
  956.     move.w    str_sys(pc,d0.w),d0
  957.     jmp    str_sys(pc,d0.w)
  958.  
  959.     .dc.w    Inkey0-str_sys
  960.     .dc.w    Inkey-str_sys
  961.     .dc.w    Time-str_sys
  962.     .dc.w    Day-str_sys
  963.     .dc.w    Date-str_sys
  964. str_sys:
  965.  
  966. Date:
  967.     IOCS    _DATEGET
  968.     move.l    d0,d1        * BCD
  969.     IOCS    _DATEBIN
  970.     move.l    d0,d1        * binary
  971.     lsl.l    #4,d1
  972.     ori.b    #$02,d1        * yy/mm/dd
  973.     ror.l    #4,d1
  974.     movea.l    strbuf,a0
  975.     addi.l    #$100,strbuf
  976.     move.l    a1,-(sp)
  977.     movea.l    a0,a1
  978.     IOCS    _DATEASC
  979.     move.l    (sp)+,a1
  980.     rts
  981.  
  982. Day:
  983.     IOCS    _DATEGET
  984.     swap    d0
  985.     lsr.w    #8,d0
  986.     moveq    #0,d1
  987.     move.b    d0,d1        * 曜日
  988.     movea.l    strbuf,a0
  989.     addi.l    #$100,strbuf
  990.     move.l    a1,-(sp)
  991.     movea.l    a0,a1
  992.     IOCS    _DAYASC
  993.     move.l    (sp)+,a1
  994.     rts
  995.  
  996. Time:
  997.     IOCS    _TIMEGET
  998.     move.l    d0,d1        * BCD
  999.     IOCS    _TIMEBIN
  1000.     move.l    d0,d1        * binary
  1001.     movea.l    strbuf,a0
  1002.     addi.l    #$100,strbuf
  1003.     move.l    a1,-(sp)
  1004.     movea.l    a0,a1
  1005.     IOCS    _TIMEASC
  1006.     move.l    (sp)+,a1
  1007.     rts
  1008.  
  1009. Inkey0:
  1010.     move.w    #1,-(sp)
  1011.     DOS    _KEYCTRL
  1012.     addq.l    #2,sp
  1013.     tst.l    d0
  1014.     beq    @f
  1015.     clr.w    -(sp)
  1016.     DOS    _KEYCTRL
  1017.     addq.l    #2,sp
  1018. @@:
  1019.     movea.l    strbuf,a0
  1020.     addi.l    #$100,strbuf
  1021.     clr.w    (a0)
  1022.     move.b    d0,(a0)
  1023.     rts
  1024.  
  1025.  
  1026. Inkey:
  1027.     bsr    cursor_on
  1028. @@:
  1029.     clr.w    -(sp)
  1030.     DOS    _KEYCTRL
  1031.     addq.l    #2,sp
  1032.     tst.b    d0    * 一部のFEPにバグがあるらしい( 島崎さん )
  1033.     beq    @b
  1034.  
  1035.     movea.l    strbuf,a0
  1036.     addi.l    #$100,strbuf
  1037.     clr.w    (a0)
  1038.     move.b    d0,(a0)
  1039.  
  1040.     bra    cursor_off
  1041. *    bsr    cursor_off
  1042. *    rts
  1043.  
  1044.  
  1045.  
  1046. normal_str_var:
  1047.     movea.l    変数str,a0        * とりあえず兼用
  1048.     lsl.w    #8,d0
  1049.     lea.l    (a0,d0.w),a0
  1050.     rts
  1051. auto_str_var:
  1052.     move.w    (a5)+,d0
  1053.     movea.l    Astr(a4),a0
  1054.     lsl.w    #8,d0
  1055.     lea.l    (a0,d0.w),a0
  1056.     rts
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.  
  1063. str_dim:
  1064.     bsr    dim_sub
  1065.     lsl.l    #8,d0
  1066.     lea.l    (a0,d0.l),a0
  1067.     rts
  1068.  
  1069.  
  1070.  
  1071.  
  1072.  
  1073. sg1:
  1074.     bclr    #14,d0
  1075.     beq    str_imm
  1076.  * str_fnc
  1077.     movem.l    d2-d4/a1,-(sp)
  1078.     bsr    function_call
  1079.     tst.w    (a0)
  1080.     bne    返り値がない
  1081.     movea.l    2+4(a0),a1
  1082.     movea.l    strbuf,a0
  1083.     addi.l    #$100,strbuf
  1084.     move.l    a0,d2        * 保存
  1085. @@:
  1086.     move.b    (a1)+,(a0)+
  1087.     bne    @b
  1088.     movea.l    d2,a0
  1089.     movem.l    (sp)+,d2-d4/a1
  1090.     rts
  1091.  
  1092.  
  1093. str_imm:
  1094.     movea.l    a5,a0
  1095. @@:
  1096.     tst.b    (a5)+
  1097.     bne    @b
  1098.     addq.l    #1,a5
  1099.     move.l    a5,d0
  1100.     bclr    #0,d0
  1101.     movea.l    d0,a5
  1102.     rts
  1103.  
  1104.  
  1105. str_cal:
  1106.     move.w    (a5)+,d0
  1107.     cmpi.w    #5*2,d0        * '+'
  1108.     bne    strに足し算以外
  1109.  
  1110.     movea.l    strbuf,a0
  1111.     addi.l    #$100,strbuf
  1112.  
  1113.     movem.l    a0/a1,-(sp)
  1114.     move.w    #255-1,d1
  1115.     movea.l    a0,a1
  1116.  
  1117.     bsr    str値get
  1118. @@:
  1119.     move.b    (a0)+,(a1)+
  1120.     dbeq    d1,@b
  1121.     subq.l    #1,a1
  1122.  
  1123.     bsr    str値get
  1124. @@:
  1125.     move.b    (a0)+,(a1)+
  1126.     dbeq    d1,@b
  1127.     clr.b    (a1)
  1128.  
  1129.     movem.l    (sp)+,a0/a1
  1130.     rts
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137. **    **    **    **    **    **
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143. **    **    **    **    **    **
  1144.  
  1145. int_system_var:
  1146.     add.w    d0,d0
  1147.     move.w    int_sys(pc,d0.w),d0
  1148.     jmp    int_sys(pc,d0.w)
  1149.  
  1150.     .dc.w    Pos-int_sys
  1151.     .dc.w    Free-int_sys
  1152.     .dc.w    Errno-int_sys
  1153.     .dc.w    Csrlin-int_sys
  1154. int_sys:
  1155.  
  1156. Csrlin:
  1157.     move.l    d1,-(sp)
  1158.     moveq    #-1,d1
  1159.     IOCS    _B_LOCATE        * dos_call で出来ないかなぁ
  1160.     move.l    (sp)+,d1
  1161.     swap    d0
  1162.     clr.w    d0
  1163.     swap    d0
  1164.     add.w    scroll開始行,d0
  1165.     rts
  1166. Pos:
  1167.     move.l    d1,-(sp)
  1168.     moveq    #-1,d1
  1169.     IOCS    _B_LOCATE        * dos_call で出来ないかなぁ
  1170.     move.l    (sp)+,d1
  1171. *    swap    d0
  1172.     clr.w    d0
  1173.     swap    d0
  1174.     rts
  1175. Free:
  1176.     move.l    mem_last,d0
  1177.     sub.l    変数area,d0
  1178.     rts
  1179. Errno:
  1180.     move.l    errorno,d0
  1181.     rts
  1182.  
  1183.  
  1184.  
  1185.  
  1186. int_cal:
  1187.     move.w    (a5)+,d0
  1188.     move.w    ic(pc,d0.w),d0
  1189.     jmp    ic(pc,d0.w)
  1190. ic:
  1191.     .dc.w    0    * dummy
  1192.     .dc.w    Imul-ic
  1193.     .dc.w    Idiv-ic
  1194.     .dc.w    Idiv2-ic
  1195.     .dc.w    Imod-ic
  1196.     .dc.w    Iadd-ic
  1197.     .dc.w    Isub-ic
  1198.     .dc.w    Ishr-ic
  1199.     .dc.w    Ishl-ic
  1200.     .dc.w    Iequal-ic
  1201.     .dc.w    Inoteq-ic
  1202.     .dc.w    Ismall-ic
  1203.     .dc.w    Ilarge-ic
  1204.     .dc.w    Ieq_small-ic
  1205.     .dc.w    Ieq_large-ic
  1206.     .dc.w    Inot-ic
  1207.     .dc.w    Iand-ic
  1208.     .dc.w    Ior-ic
  1209.     .dc.w    Ixor-ic
  1210.     .dc.w    Iminus-ic    * $13
  1211.     .dc.w    0        * reserve $14
  1212.     .dc.w    0        * reserve $15
  1213.     .dc.w    0        * reserve $16
  1214.     .dc.w    0        * reserve $17
  1215.     .dc.w    0        * reserve $18
  1216.     .dc.w    0        * reserve $19
  1217.     .dc.w    0        * reserve $1a
  1218.     .dc.w    0        * reserve $1b
  1219.     .dc.w    0        * reserve $1c
  1220.     .dc.w    0        * reserve $1d
  1221.     .dc.w    0        * reserve $1e
  1222.     .dc.w    0        * reserve $1f
  1223.     .dc.w    Iadd1-ic    * $20
  1224.     .dc.w    Iadd2-ic
  1225.     .dc.w    Iadd3-ic
  1226.     .dc.w    Iadd4-ic
  1227.     .dc.w    Iadd5-ic
  1228.     .dc.w    Iadd6-ic
  1229.     .dc.w    Iadd7-ic
  1230.     .dc.w    Iadd8-ic
  1231.     .dc.w    Isub1-ic    * $28
  1232.     .dc.w    Isub2-ic
  1233.     .dc.w    Isub3-ic
  1234.     .dc.w    Isub4-ic
  1235.     .dc.w    Isub5-ic
  1236.     .dc.w    Isub6-ic
  1237.     .dc.w    Isub7-ic
  1238.     .dc.w    Isub8-ic
  1239.     .dc.w    Imul02-ic    * $30
  1240.     .dc.w    Imul03-ic
  1241.     .dc.w    Imul04-ic
  1242.     .dc.w    Imul05-ic
  1243.     .dc.w    Imul06-ic
  1244.     .dc.w    Imul07-ic
  1245.     .dc.w    Imul08-ic
  1246.     .dc.w    Imul09-ic
  1247.     .dc.w    Imul10-ic
  1248.     .dc.w    Imul11-ic
  1249.     .dc.w    Imul12-ic
  1250.     .dc.w    Imul13-ic
  1251.     .dc.w    Imul14-ic
  1252.     .dc.w    Imul15-ic
  1253.     .dc.w    Imul16-ic
  1254.     .dc.w    0        * reserve $3f
  1255.     .dc.w    Imul32-ic
  1256.     .dc.w    Imul64-ic
  1257.     .dc.w    Imul128-ic
  1258.     .dc.w    Imul256-ic
  1259.     .dc.w    0        * reserve $44
  1260.     .dc.w    0        * reserve $45
  1261.     .dc.w    0        * reserve $46
  1262.     .dc.w    0        * reserve $47
  1263.     .dc.w    Idiv2_1-ic    * $48
  1264.     .dc.w    Idiv2_2-ic
  1265.     .dc.w    Idiv2_3-ic
  1266.     .dc.w    Idiv2_4-ic
  1267.     .dc.w    Idiv2_5-ic
  1268.     .dc.w    Idiv2_6-ic
  1269.     .dc.w    Idiv2_7-ic
  1270.     .dc.w    Idiv2_8-ic
  1271.     .dc.w    Ishr1-ic    * $50
  1272.     .dc.w    Ishr2-ic
  1273.     .dc.w    Ishr3-ic
  1274.     .dc.w    Ishr4-ic
  1275.     .dc.w    Ishr5-ic
  1276.     .dc.w    Ishr6-ic
  1277.     .dc.w    Ishr7-ic
  1278.     .dc.w    Ishr8-ic
  1279.  
  1280.  
  1281. Imul:
  1282. .ifdef    _XB030
  1283.     bsr    int値get
  1284.     move.l    d0,-(sp)
  1285.     bsr    int値get
  1286.     muls.l    (sp)+,d0
  1287. .else
  1288.     move.l    d1,-(sp)
  1289.     bsr    int値get
  1290.     move.l    d0,d1
  1291.     bsr    int値get
  1292.     FPACK    __LMUL
  1293.     move.l    (sp)+,d1
  1294. .endif
  1295.     rts
  1296. Idiv:
  1297. Idiv2:
  1298. .ifdef    _XB030
  1299.     move.l    d1,-(sp)
  1300.     bsr    int値get
  1301.     move.l    d0,d1
  1302.     bsr    int値get
  1303.     tst.l    d0
  1304.     beq    zero_div
  1305.     exg    d0,d1
  1306.     divs.l    d1,d0
  1307.     move.l    (sp)+,d1
  1308. .else
  1309.     move.l    d1,-(sp)
  1310.     bsr    int値get
  1311.     move.l    d0,d1
  1312.     bsr    int値get
  1313.     tst.l    d0
  1314.     beq    zero_div
  1315.     exg    d0,d1
  1316.     FPACK    __LDIV        * 手抜き
  1317.     move.l    (sp)+,d1
  1318. .endif
  1319.     rts
  1320. Imod:
  1321. .ifdef    _XB030
  1322.     move.l    d1,-(sp)
  1323.     bsr    int値get
  1324.     move.l    d0,d1
  1325.     bsr    int値get
  1326.     tst.l    d0
  1327.     beq    zero_div
  1328.     divsl.l    d0,d0:d1
  1329.     move.l    (sp)+,d1
  1330. .else
  1331.     move.l    d1,-(sp)
  1332.     bsr    int値get
  1333.     move.l    d0,d1
  1334.     bsr    int値get
  1335.     tst.l    d0
  1336.     beq    zero_div
  1337.     exg    d0,d1
  1338.     FPACK    __LMOD        * 手抜き
  1339.     move.l    (sp)+,d1
  1340. .endif
  1341.     rts
  1342.  
  1343. Iadd:
  1344.     bsr    int値get
  1345.     move.l    d0,-(sp)
  1346.     bsr    int値get
  1347.     add.l    (sp)+,d0
  1348.     rts
  1349.  
  1350. Isub:
  1351.     move.l    d1,-(sp)
  1352.     bsr    int値get
  1353.     move.l    d0,d1
  1354.     bsr    int値get
  1355.     sub.l    d0,d1
  1356.     move.l    d1,d0
  1357.     move.l    (sp)+,d1
  1358.     rts
  1359.  
  1360. Ishr:
  1361.     move.l    d1,-(sp)
  1362.     bsr    int値get
  1363.     move.l    d0,d1
  1364.     bsr    int値get
  1365.     lsr.l    d0,d1
  1366.     move.l    d1,d0
  1367.     move.l    (sp)+,d1
  1368.     rts
  1369. Ishl:
  1370.     move.l    d1,-(sp)
  1371.     bsr    int値get
  1372.     move.l    d0,d1
  1373.     bsr    int値get
  1374.     lsl.l    d0,d1
  1375.     move.l    d1,d0
  1376.     move.l    (sp)+,d1
  1377.     rts
  1378.  
  1379.  
  1380.  
  1381.     * 実数・文字列の比較の時有り
  1382. 二数比較:
  1383. *    tst.b    d0
  1384.     bmi    二比float
  1385.     subq.b    #2,d0
  1386.     beq    二比char
  1387. *二比str:
  1388.     movem.l    d4/a1,-(sp)
  1389.     bsr    str値get
  1390.     move.l    a0,a1
  1391.     bsr    str値get
  1392. @@:
  1393.     move.b    (a0)+,d0
  1394.     beq    @f
  1395.     cmp.b    (a1)+,d0
  1396.     beq    @b
  1397.     movem.l    (sp)+,d4/a1
  1398.     rts
  1399. @@:
  1400.     cmp.b    (a1),d0
  1401.     movem.l    (sp)+,d4/a1
  1402.     rts
  1403.  
  1404. 二比float:
  1405.     move.w    d4,-(sp)
  1406.     bsr    float値get
  1407.     move.l    d0,d2
  1408.     move.l    d1,d3
  1409.     bsr    float値get
  1410.     move.w    (sp)+,d4
  1411.     FPACK    __DCMP
  1412.     rts
  1413.  
  1414. 二比char:
  1415.     bsr    int値get
  1416.     move.l    d0,d1
  1417.     bsr    int値get
  1418.     cmp.b    d1,d0
  1419.     rts
  1420.  
  1421.  
  1422.  
  1423. Iequal:
  1424.     move.l    d1,-(sp)
  1425.     move.b    1(a5),d0
  1426.     beq    二比int_eq
  1427.     bsr    二数比較
  1428.     beq    true
  1429.     bra    false
  1430. 二比int_eq:
  1431.     bsr    int値get
  1432.     move.l    d0,d1
  1433.     bsr    int値get
  1434.     cmp.l    d1,d0
  1435.     beq    true
  1436.     bra    false
  1437.  
  1438. Inoteq:
  1439.     move.l    d1,-(sp)
  1440.     move.b    1(a5),d0
  1441.     beq    二比int_ne
  1442.     bsr    二数比較
  1443.     bne    true
  1444.     bra    false
  1445. 二比int_ne:
  1446.     bsr    int値get
  1447.     move.l    d0,d1
  1448.     bsr    int値get
  1449.     cmp.l    d1,d0
  1450.     bne    true
  1451.     bra    false
  1452.  
  1453. Ismall:
  1454.     move.l    d1,-(sp)
  1455.     move.b    1(a5),d0
  1456.     beq    @f
  1457.     bsr    二数比較
  1458.     bhi    true
  1459.     bra    false
  1460. @@:
  1461.     bsr    int値get
  1462.     move.l    d0,d1
  1463.     bsr    int値get
  1464.     cmp.l    d1,d0
  1465.     bgt    true
  1466.     bra    false
  1467.  
  1468. Ilarge:
  1469.     move.l    d1,-(sp)
  1470.     move.b    1(a5),d0
  1471.     beq    @f
  1472.     bsr    二数比較
  1473.     bcs    true
  1474.     bra    false
  1475. @@:
  1476.     bsr    int値get
  1477.     move.l    d0,d1
  1478.     bsr    int値get
  1479.     cmp.l    d1,d0
  1480.     blt    true
  1481.     bra    false
  1482.  
  1483. Ieq_small:
  1484.     move.l    d1,-(sp)
  1485.     move.b    1(a5),d0
  1486.     beq    @f
  1487.     bsr    二数比較
  1488.     bcc    true
  1489.     bra    false
  1490. @@:
  1491.     bsr    int値get
  1492.     move.l    d0,d1
  1493.     bsr    int値get
  1494.     cmp.l    d1,d0
  1495.     bge    true
  1496.     bra    false
  1497.  
  1498. Ieq_large:
  1499.     move.l    d1,-(sp)
  1500.     move.b    1(a5),d0
  1501.     beq    @f
  1502.     bsr    二数比較
  1503.     bls    true
  1504.     bra    false
  1505. @@:
  1506.     bsr    int値get
  1507.     move.l    d0,d1
  1508.     bsr    int値get
  1509.     cmp.l    d1,d0
  1510.     ble    true
  1511.     bra    false
  1512.  
  1513. true:
  1514.     moveq    #-1,d0
  1515.     move.l    (sp)+,d1
  1516.     rts
  1517. false:
  1518.     moveq    #0,d0
  1519.     move.l    (sp)+,d1
  1520.     rts
  1521.  
  1522.  
  1523.  
  1524.  
  1525. Inot:
  1526.     bsr    int値get
  1527.     not.l    d0
  1528.     rts
  1529. Iand:
  1530.     bsr    int値get
  1531.     move.l    d0,-(sp)
  1532.     bsr    int値get
  1533.     and.l    (sp)+,d0
  1534.     rts
  1535. Ior:
  1536.     bsr    int値get
  1537.     move.l    d0,-(sp)
  1538.     bsr    int値get
  1539.     or.l    (sp)+,d0
  1540.     rts
  1541. Ixor:
  1542.     move.l    d1,-(sp)
  1543.     bsr    int値get
  1544.     move.l    d0,d1
  1545.     bsr    int値get
  1546.     eor.l    d1,d0
  1547.     move.l    (sp)+,d1
  1548.     rts
  1549. Iminus:
  1550.     bsr    int値get
  1551.     neg.l    d0
  1552.     rts
  1553.  
  1554.     .irpc    ch,12345678
  1555. Iadd&ch:
  1556.     bsr    int値get
  1557.     addq.l    #&ch,d0
  1558.     rts
  1559.     .endm
  1560.  
  1561.     .irpc    ch,12345678
  1562. Isub&ch:
  1563.     bsr    int値get
  1564.     subq.l    #&ch,d0
  1565.     rts
  1566.     .endm
  1567.  
  1568.  
  1569. Idiv2_1:
  1570.     bsr    int値get
  1571.     tst.l    d0
  1572.     bge    @f
  1573.     addq.l    #1,d0
  1574. @@:
  1575.     asr.l    #1,d0
  1576.     rts
  1577. Idiv2_2:
  1578.     bsr    int値get
  1579.     tst.l    d0
  1580.     bge    @f
  1581.     addq.l    #3,d0
  1582. @@:
  1583.     asr.l    #2,d0
  1584.     rts
  1585. Idiv2_3:
  1586.     bsr    int値get
  1587.     tst.l    d0
  1588.     bge    @f
  1589.     addq.l    #7,d0
  1590. @@:
  1591.     asr.l    #3,d0
  1592.     rts
  1593.  
  1594.     .irpc    ch,45678
  1595. Idiv2_&ch:
  1596.     bsr    int値get
  1597.     tst.l    d0
  1598.     bge    @f
  1599.     neg.l    d0
  1600.     asr.l    #&ch,d0
  1601.     neg.l    d0
  1602.     rts
  1603. @@:
  1604.     asr.l    #&ch,d0
  1605.     rts
  1606.     .endm
  1607.  
  1608.     .irpc    ch,12345678
  1609. Ishr&ch:
  1610.     bsr    int値get
  1611.     lsr.l    #&ch,d0
  1612.     rts
  1613.     .endm
  1614.  
  1615. Imul02:
  1616.     bsr    int値get
  1617.     add.l    d0,d0
  1618.     rts
  1619. Imul03:
  1620.     bsr    int値get
  1621.     move.l    d0,-(sp)
  1622.     add.l    d0,d0
  1623.     add.l    (sp)+,d0
  1624.     rts
  1625. Imul04:
  1626.     bsr    int値get
  1627.     lsl.l    #2,d0
  1628.     rts
  1629. Imul05:
  1630.     bsr    int値get
  1631.     move.l    d0,-(sp)
  1632.     lsl.l    #2,d0
  1633.     add.l    (sp)+,d0
  1634.     rts
  1635. Imul06:
  1636.     bsr    int値get
  1637.     add.l    d0,d0
  1638.     move.l    d0,-(sp)
  1639.     add.l    d0,d0
  1640.     add.l    (sp)+,d0
  1641.     rts
  1642. Imul07:
  1643.     bsr    int値get
  1644.     move.l    d0,-(sp)
  1645.     lsl.l    #3,d0
  1646.     sub.l    (sp)+,d0
  1647.     rts
  1648. Imul08:
  1649.     bsr    int値get
  1650.     lsl.l    #3,d0
  1651.     rts
  1652. Imul09:
  1653.     bsr    int値get
  1654.     move.l    d0,-(sp)
  1655.     lsl.l    #3,d0
  1656.     add.l    (sp)+,d0
  1657.     rts
  1658. Imul10:
  1659.     bsr    int値get
  1660.     add.l    d0,d0
  1661.     move.l    d0,-(sp)
  1662.     lsl.l    #2,d0
  1663.     add.l    (sp)+,d0
  1664.     rts
  1665. Imul11:
  1666.     bsr    int値get
  1667.     move.l    d0,-(sp)
  1668.     add.l    d0,d0
  1669.     add.l    d0,(sp)
  1670.     lsl.l    #2,d0
  1671.     add.l    (sp)+,d0
  1672.     rts
  1673. Imul12:
  1674.     bsr    int値get
  1675.     lsl.l    #2,d0
  1676.     move.l    d0,-(sp)
  1677.     add.l    d0,d0
  1678.     add.l    (sp)+,d0
  1679.     rts
  1680. Imul13:
  1681.     bsr    int値get
  1682.     move.l    d0,-(sp)
  1683.     lsl.l    #2,d0
  1684.     add.l    d0,(sp)
  1685.     add.l    d0,d0
  1686.     add.l    (sp)+,d0
  1687.     rts
  1688. Imul14:
  1689.     bsr    int値get
  1690.     add.l    d0,d0
  1691.     move.l    d0,-(sp)
  1692.     lsl.l    #3,d0
  1693.     sub.l    (sp)+,d0
  1694.     rts
  1695. Imul15:
  1696.     bsr    int値get
  1697.     move.l    d0,-(sp)
  1698.     lsl.l    #4,d0
  1699.     sub.l    (sp)+,d0
  1700.     rts
  1701. Imul16:
  1702.     bsr    int値get
  1703.     lsl.l    #4,d0
  1704.     rts
  1705. Imul32:
  1706.     bsr    int値get
  1707.     lsl.l    #5,d0
  1708.     rts
  1709. Imul64:
  1710.     bsr    int値get
  1711.     lsl.l    #6,d0
  1712.     rts
  1713. Imul128:
  1714.     bsr    int値get
  1715.     lsl.l    #7,d0
  1716.     rts
  1717. Imul256:
  1718.     bsr    int値get
  1719.     lsl.l    #8,d0
  1720.     rts
  1721.  
  1722.  
  1723.  
  1724.     .xdef    strに足し算以外
  1725. strに足し算以外:
  1726.     IERROR    2
  1727. zero_div:
  1728.     IERROR    69
  1729.  
  1730.  
  1731.  
  1732.  
  1733.  
  1734.  
  1735.  
  1736.     .xdef    dim_sub
  1737. dim_sub:
  1738.     move.w    (a5)+,d1    * 配列番号
  1739.  
  1740.     btst    #8,d0
  1741.     beq    @f
  1742.     lea.l    Adim(a4),a0
  1743.     bra    dim3
  1744.  
  1745.  
  1746.     .xdef    dim_set_sub
  1747. dim_set_sub:
  1748.     move.w    (a5)+,d1    * 配列番号
  1749.     bge    @f
  1750.     not.w    d1
  1751.     lea.l    Adim(a4),a0        * auto
  1752.     bra    dim3
  1753. @@:
  1754.     movea.l    配列,a0            * global
  1755.  
  1756.  
  1757. dim3:
  1758. .ifdef    _XB030
  1759.     movea.l    (a0,d1.w*4),a0    * 配列ポインタ
  1760. .else
  1761.     lsl.w    #2,d1
  1762.     movea.l    (a0,d1.w),a0    * 配列ポインタ
  1763. .endif
  1764.     move.w    4(a0),d1    * 次元 - 1
  1765.     addq.l    #8,a0
  1766.     beq    one_dim
  1767.  
  1768.                 * 二次元以上の時
  1769.     movem.l    d2-d5/a1,-(sp)
  1770.  
  1771.     move.w    d1,d5
  1772. .ifdef    _XB030
  1773.     lea.l    2(a0,d1.w*2),a1
  1774. .else
  1775.     add.w    d1,d1
  1776.     lea.l    2(a0,d1.w),a1
  1777. .endif
  1778.     moveq    #0,d1
  1779.     bra    dim4
  1780. dim5:
  1781. .ifdef    _XB030
  1782.     mulu.l    (a1)+,d0
  1783.     add.l    d0,d1
  1784. .else
  1785.     move.l    d1,d2
  1786.     move.l    (a1)+,d1
  1787.     FPACK    __UMUL
  1788.     move.l    d0,d1
  1789.     add.l    d2,d1
  1790. .endif
  1791. dim4:
  1792.     move.l    a0,-(sp)
  1793.     bsr    int値get
  1794.     movea.l    (sp)+,a0
  1795.     cmpi.l    #$10000,d0
  1796.     bcc    添え字大きすぎ
  1797.     cmp.w    (a0)+,d0        * 添え字の大きさ
  1798.     bhi    添え字大きすぎ
  1799.     dbra    d5,dim5
  1800.  
  1801.     add.l    d1,d0
  1802.     movea.l    a1,a0
  1803.     movem.l    (sp)+,d2-d5/a1
  1804.     rts
  1805.  
  1806.  
  1807. one_dim:            * 一次元の時
  1808.     move.l    a0,-(sp)
  1809.     bsr    int値get
  1810.     move.l    (sp)+,a0
  1811.     cmpi.l    #$10000,d0
  1812.     bcc    添え字大きすぎ1
  1813.     cmp.w    (a0)+,d0        * 添え字の大きさ
  1814.     bhi    添え字大きすぎ2
  1815.     rts
  1816.  
  1817.  
  1818. 添え字大きすぎ1:
  1819. .if 0
  1820.     move.l    d0,-(sp)
  1821.     bsr    dec_print
  1822.     move.l    #$10000,(sp)
  1823.     bsr    dec_print
  1824.     bra    @f
  1825. .endif
  1826. 添え字大きすぎ2:
  1827. .if 0
  1828.     move.l    d0,-(sp)
  1829.     bsr    dec_print
  1830.     moveq    #0,d1
  1831.     move.w    -2(a0),d1
  1832.     move.l    d1,(sp)
  1833.     bsr    dec_print
  1834. @@:
  1835.     addq.l    #4,sp
  1836. .endif
  1837. 添え字大きすぎ:
  1838.     tst.l    d0
  1839.     bmi    @f
  1840.     IERROR    37
  1841. @@:
  1842.     IERROR    38
  1843.  
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.  
  1853.  
  1854.  
  1855.  
  1856.  
  1857.  
  1858.  
  1859.  
  1860.  
  1861.  
  1862.  
  1863. **    **    **    **    **    **    **    **
  1864.  
  1865.  * 各ステートメントごとの処理
  1866.  
  1867.  
  1868.  
  1869.  
  1870. Gosub:        * サポートの予定は未定
  1871.     IERROR    10
  1872.  
  1873.  
  1874. Case:        * 呼ばれるはずのないステートメント
  1875. Default:
  1876.     .xdef    noSTAT
  1877. noSTAT:
  1878.     IERROR    2
  1879.  
  1880.  
  1881.  
  1882.  
  1883. Func:
  1884.     IERROR    76
  1885.  
  1886. SysVar:
  1887.     bsr    str値get
  1888.     tst.w    (a5)+
  1889.     beq    SetDate
  1890. SetTime:
  1891.     movea.l    a0,a1
  1892.     IOCS    _TIMECNV
  1893.     move.l    d0,d1
  1894.     bmi    ireg_set_sysvar
  1895.     IOCS    _TIMEBCD
  1896.     move.l    d0,d1
  1897.     IOCS    _TIMESET
  1898.     bra    main_loop
  1899. SetDate:
  1900.     movea.l    a0,a1
  1901.     IOCS    _DATECNV
  1902.     move.l    d0,d1
  1903.     bmi    ireg_set_sysvar
  1904.     IOCS    _DATEBCD
  1905.     move.l    d0,d1
  1906.     IOCS    _DATESET
  1907.     bra    main_loop
  1908.  
  1909. ireg_set_sysvar:
  1910.     IERROR    70
  1911.  
  1912. Error:
  1913.     tst.w    (a5)+
  1914.     beq    ErrorOff
  1915.     bclr    #errorF,d7
  1916.     bra    main_loop
  1917. ErrorOff:
  1918.     bset    #errorF,d7
  1919.     bra    main_loop
  1920.  
  1921.  
  1922. Key:
  1923.     bsr    int値get
  1924.     tst.w    d0
  1925.     beq    key_err
  1926.     cmpi.w    #20,d0
  1927.     bhi    key_err
  1928.     ori.w    #$100,d0
  1929.     subq.l    #4,sp
  1930.     move.w    d0,-(sp)
  1931.     bsr    str値get
  1932.     move.l    a0,2(sp)
  1933.     DOS    _FNCKEY
  1934.     addq.l    #6,sp
  1935.     bra    main_loop
  1936. key_err:
  1937.     IERROR    64
  1938.  
  1939.  
  1940.  * 文字列ポインタへの代入
  1941. Str:
  1942.     bsr    int値get    * 代入ポインタ
  1943.     move.l    d0,d1
  1944.     cmpi.w    #$100,d1
  1945.     bcc    str_access_err
  1946.     bsr    int値get    * ほんとは char だけど
  1947.     move.w    (a5)+,d2    * str変数番号
  1948.     bge    1f
  1949.     not.w    d2
  1950.     movea.l    Astr(a4),a0
  1951.     bra    2f
  1952. 1:
  1953.     movea.l    変数str,a0        * とりあえず兼用
  1954. 2:
  1955.     lsl.w    #8,d2
  1956.     add.w    d1,d2
  1957.     tst.b    (a0,d2.w)
  1958. *    beq    @f
  1959.     move.b    d0,(a0,d2.w)
  1960.     bra    main_loop
  1961. *@@:
  1962. *    move.b    d0,(a0,d2.w)
  1963. *    clr.b    1(a0,d2.w)    * 文字列の最後だった時のための用心
  1964. *    bra    main_loop
  1965.  
  1966. str_access_err:
  1967.     IERROR    41
  1968.  
  1969.  
  1970.  
  1971.  * 配列の初期化
  1972. Dim:
  1973.     move.w    (a5)+,d1    * 型
  1974.     bmi    可変長配列定義
  1975.     movea.l    配列,a1
  1976.     move.w    (a5)+,d0    * 配列番号
  1977.     bpl    @f
  1978.     lea.l    Adim(a4),a1
  1979.     not.w    d0
  1980. @@:
  1981.     lsl.w    #2,d0
  1982.     movea.l    (a1,d0.w),a1
  1983.  
  1984.     move.w    4(a1),d0    * 次元
  1985.     add.w    d0,d0
  1986.     move.w    d0,d2
  1987.     add.w    d0,d0
  1988.     add.w    d2,d0        * 6倍
  1989.     lea.l    10(a1,d0.w),a1    * データ領域先頭
  1990.     move.w    (a5)+,d2    * 個数 - 1
  1991.  
  1992.     tst.b    d1
  1993.     beq    int_dim_init
  1994.     bmi    float_dim_init
  1995.     subq.b    #1,d1
  1996.     bne    char_dim_init
  1997. str_dim_init:
  1998.     movea.l    a1,a0
  1999. @@:
  2000.     move.b    (a5)+,(a0)+
  2001.     bne    @b
  2002.     lea.l    $100(a1),a1
  2003.     dbra    d2,str_dim_init
  2004.     bra    @f
  2005. char_dim_init:
  2006.     move.b    (a5)+,(a1)+
  2007.     dbra    d2,char_dim_init
  2008. @@:
  2009.     addq.l    #1,a5
  2010.     move.l    a5,d0
  2011.     bclr    #0,d0
  2012.     movea.l    d0,a5
  2013.     bra    main_loop
  2014. float_dim_init:
  2015.     move.l    (a5)+,(a1)+
  2016.     move.l    (a5)+,(a1)+
  2017.     dbra    d2,float_dim_init
  2018.     bra    main_loop
  2019. int_dim_init:
  2020.     move.l    (a5)+,(a1)+
  2021.     dbra    d2,int_dim_init
  2022.     bra    main_loop
  2023.  
  2024.  
  2025.  
  2026.  
  2027. 可変長配列定義:
  2028.     move.w    (a5)+,d0    * 配列番号
  2029.     move.w    (a5)+,d3    * 次元 - 1
  2030.  
  2031.     movea.l    変数area,a1
  2032.     btst    #0,d3
  2033.     bne    @f        * 奇数次元の時に
  2034.     addq.l    #2,a1        * 配列の要素がロングワード境界に来るように小細工
  2035. @@:
  2036.     not.w    d0
  2037.     lsl.w    #2,d0
  2038.     move.l    a1,Adim(a4,d0.w)
  2039.  
  2040.  
  2041.     clr.l    (a1)+        * offset (無効)
  2042.     move.w    d3,(a1)+        * 次元-1
  2043.  
  2044.         bsr    dim_clr_sub1
  2045.  
  2046.     move.w    d3,d1        * 次元 - 1
  2047. @@:
  2048.     bsr    int値get
  2049.     move.w    d0,(a1)+    * 添え字の大きさ
  2050.     swap    d0
  2051.     tst.w    d0
  2052.     bne    添字大きさ不正
  2053.     dbra    d1,@b
  2054.  
  2055.  
  2056.  
  2057.         bsr    dim_clr_sub2
  2058.  
  2059.     lea.l    (a1,d0.l),a0
  2060.     cmpa.l    mem_last,a0
  2061.     bcc    mem_err
  2062.  
  2063.     btst    #v_initF,d7
  2064.     beq    @f
  2065.     andi.b    #$fc,d0
  2066.     adda.l    d0,a1
  2067.     bra    1f
  2068. @@:
  2069.     lsr.l    #2,d0
  2070.     moveq    #0,d1
  2071.     bsr    a1_clr_d0Lx4
  2072. 1:
  2073.     move.l    a1,変数area
  2074.     bra    main_loop
  2075.  
  2076.  
  2077. 添字大きさ不正:
  2078.     IERROR    36
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084. Switch:
  2085.     bsr    int値get    * 値1
  2086.     adda.l    (a5),a5        *** JUMP ***  switch table
  2087.     move.w    (a5)+,d2    * case の個数 - 1
  2088.     bra    @f
  2089. sw_loop:
  2090.     addq.l    #4,a5
  2091. @@:
  2092.     cmp.l    (a5)+,d0
  2093.     dbeq    d2,sw_loop
  2094.     beq    sw_default
  2095.     addq.l    #4,a5
  2096. sw_default:
  2097.     adda.l    (a5),a5        *** JUMP ***
  2098.     bra    main_loop
  2099.  
  2100.  
  2101.  
  2102.     .xdef    Switch2
  2103. Switch2:
  2104.     bsr    str値get    * 値1
  2105.     moveq    #-2,d0        * 文字列長さ
  2106.     movea.l    a0,a1
  2107. @@:
  2108.     addq.w    #1,d0
  2109.     tst.b    (a1)+
  2110.     bne    @b
  2111.  
  2112.     adda.l    (a5),a5        *** JUMP ***  switch table
  2113.     move.w    (a5)+,d2    * case の個数 - 1
  2114. sw_loop2:
  2115.     move.w    (a5)+,d1    * 文字列長さ
  2116.     cmp.w    d0,d1
  2117.     bne    sw2_out
  2118.     tst.w    d1
  2119.     bmi    sw2_ok
  2120.  
  2121.     movea.l    a0,a1
  2122.     movea.l    a5,a2
  2123. @@:
  2124.     cmp.b    (a1)+,(a2)+
  2125.     dbne    d0,@b
  2126.     bne    sw2_out2
  2127. sw2_ok:
  2128.     addq.w    #3,d1
  2129.     bclr    #0,d1
  2130.     adda.w    d1,a5
  2131.     bra    sw_default
  2132.  
  2133. sw2_out2:
  2134.     move.w    d1,d0        * H9/3/5 switch (文字列) の不都合の原因?
  2135. sw2_out:
  2136.     addq.w    #3+4,d1        * jump address skip
  2137.     bclr    #0,d1
  2138.     adda.w    d1,a5
  2139.     dbra    d2,sw_loop2
  2140.     bra    sw_default
  2141.  
  2142.  
  2143.  
  2144.  
  2145.  
  2146. For:
  2147.     bsr    int値get    * 値1
  2148.     move.l    d0,d1
  2149.  
  2150.     move.w    (a5)+,d0    * 変数番号
  2151.     bmi    for_0
  2152.     movea.l    変数int,a0        * とりあえず兼用
  2153.     bra    @f
  2154. for_0:
  2155.     not.w    d0
  2156.     movea.l    Aint(a4),a0
  2157. @@:
  2158.     lsl.w    #2,d0
  2159.     move.l    d1,(a0,d0.w)
  2160.  
  2161.     bsr    int値get    * 値2
  2162.  
  2163.     cmp.l    d1,d0
  2164.     blt    Break        ; changed from bcs (M.Kamada 95.07.09)
  2165.     addq.l    #4,a5
  2166.     bra    main_loop
  2167.  
  2168.  
  2169. Goto:
  2170. Else:
  2171. Break:
  2172. Continue:
  2173.     adda.l    (a5),a5        *** JUMP ***
  2174.     bra    main_loop
  2175.  
  2176.  
  2177.  
  2178. If:
  2179. While:
  2180. Until:
  2181.     bsr    int値get    * 値1
  2182.     tst.l    d0
  2183.     bne    条件真
  2184.  * 偽
  2185.     adda.l    (a5),a5        *** JUMP ***
  2186.     bra    main_loop
  2187.  
  2188. 条件真:
  2189.     addq.l    #4,a5
  2190.     bra    main_loop
  2191.  
  2192.  
  2193. Ifeq:
  2194.     bsr    int値get    * 値1
  2195.     move.l    d0,d1
  2196.     bsr    int値get    * 値2
  2197.     cmp.l    d0,d1
  2198.     beq    条件真
  2199.     adda.l    (a5),a5        *** JUMP ***
  2200.     bra    main_loop
  2201. Ifne:
  2202.     bsr    int値get    * 値1
  2203.     move.l    d0,d1
  2204.     bsr    int値get    * 値2
  2205.     cmp.l    d0,d1
  2206.     bne    条件真
  2207.     adda.l    (a5),a5        *** JUMP ***
  2208.     bra    main_loop
  2209. Ifgt:
  2210.     bsr    int値get    * 値1
  2211.     move.l    d0,d1
  2212.     bsr    int値get    * 値2
  2213.     cmp.l    d0,d1
  2214.     bgt    条件真
  2215.     adda.l    (a5),a5        *** JUMP ***
  2216.     bra    main_loop
  2217. Ifge:
  2218.     bsr    int値get    * 値1
  2219.     move.l    d0,d1
  2220.     bsr    int値get    * 値2
  2221.     cmp.l    d0,d1
  2222.     bge    条件真
  2223.     adda.l    (a5),a5        *** JUMP ***
  2224.     bra    main_loop
  2225. Iflt:
  2226.     bsr    int値get    * 値1
  2227.     move.l    d0,d1
  2228.     bsr    int値get    * 値2
  2229.     cmp.l    d0,d1
  2230.     blt    条件真
  2231.     adda.l    (a5),a5        *** JUMP ***
  2232.     bra    main_loop
  2233. Ifle:
  2234.     bsr    int値get    * 値1
  2235.     move.l    d0,d1
  2236.     bsr    int値get    * 値2
  2237.     cmp.l    d0,d1
  2238.     ble    条件真
  2239.     adda.l    (a5),a5        *** JUMP ***
  2240.     bra    main_loop
  2241.  
  2242.  
  2243. Endwhile:
  2244.     bsr    int値get    * 値1
  2245.     tst.l    d0
  2246.     beq    条件偽
  2247.  * 真
  2248.     adda.l    (a5),a5        *** JUMP ***
  2249.     bra    main_loop
  2250.  
  2251. 条件偽:
  2252.     addq.l    #4,a5
  2253.     bra    main_loop
  2254.  
  2255.  
  2256. Next2:
  2257.     move.w    (a5)+,d0    * 変数番号
  2258.     bmi    1f
  2259.     movea.l    変数int,a0        * とりあえず兼用
  2260.     bra    @f
  2261. 1:
  2262.     not.w    d0
  2263.     movea.l    Aint(a4),a0
  2264. @@:
  2265.     lsl.w    #2,d0
  2266.     addq.l    #1,(a0,d0.w)
  2267.     move.l    (a0,d0.w),d1
  2268.  
  2269.     cmp.l    (a5)+,d1        * 特別
  2270.     bgt    for_loop終わった
  2271.     adda.l    (a5),a5        *** JUMP ***
  2272.     bra    main_loop
  2273.  
  2274. Next:
  2275.     move.w    (a5)+,d0    * 変数番号
  2276.     bmi    next0
  2277.     movea.l    変数int,a0        * とりあえず兼用
  2278.     bra    @f
  2279. next0:
  2280.     not.w    d0
  2281.     movea.l    Aint(a4),a0
  2282. @@:
  2283.     lsl.w    #2,d0
  2284.     addq.l    #1,(a0,d0.w)
  2285.     move.l    (a0,d0.w),d1
  2286.  
  2287.     bsr    int値get    * 値2
  2288.  
  2289.     cmp.l    d0,d1
  2290.     bgt    for_loop終わった
  2291.     adda.l    (a5),a5        *** JUMP ***
  2292.     bra    main_loop
  2293.  
  2294. for_loop終わった:
  2295.     addq.l    #4,a5
  2296.     bra    main_loop
  2297.  
  2298.  
  2299.  
  2300.  
  2301.  
  2302.  
  2303.  
  2304.  
  2305.  
  2306.  
  2307. Console:
  2308.     bsr    int値get
  2309.     subq.l    #2,sp
  2310.     move.w    d0,-(sp)
  2311.     move.w    d0,scroll開始行
  2312.     bsr    int値get
  2313.     move.w    d0,2(sp)
  2314.  
  2315.     add.w    (sp),d0
  2316.     cmpi.w    #32,d0
  2317.     bhi    console_para_err
  2318.     bne    @f
  2319.     move.l    #$000e_ffff,-(sp)
  2320.     DOS    _CONCTRL
  2321.     addq.l    #4,sp
  2322.     subq.w    #3,d0
  2323.     bne    console_para_err
  2324. @@:
  2325.     move.w    #15,-(sp)
  2326.     DOS    _CONCTRL
  2327.     addq.l    #6,sp
  2328.     bra    screen_end
  2329.  
  2330. console_para_err:
  2331.     IERROR    53
  2332.  
  2333.  
  2334. FuncKey:
  2335.     bsr    int値get
  2336.     move.l    d0,d1
  2337.     subq.w    #1,d0
  2338.     bhi    func_mode_error
  2339.  
  2340.     move.l    #$000e_ffff,-(sp)
  2341.     DOS    _CONCTRL
  2342.     tst.w    d1
  2343.     beq    FuncOff
  2344. *FuncOn
  2345.     tst.l    d0
  2346.     beq    1f
  2347. *    move.l    #$000e_0000,(sp)    * console 0,31,1
  2348.     clr.w    2(sp)
  2349.     bra    @f
  2350. FuncOff:
  2351.     subq.l    #3,d0
  2352.     beq    1f
  2353.     move.l    #$000e_0002,(sp)    * console 0,31,0
  2354.     DOS    _CONCTRL
  2355.     move.l    #$000e_0003,(sp)    * 最下行有効
  2356. @@:
  2357.     DOS    _CONCTRL
  2358. 1:
  2359.     addq.l    #4,sp
  2360.     bra    screen_end
  2361.  
  2362.  
  2363. func_mode_error:
  2364.     IERROR    73
  2365.  
  2366.  
  2367. Width:
  2368.     bsr    int値get
  2369.     cmpi.w    #64,d0
  2370.     beq    width64
  2371.     moveq    #0,d1
  2372.     cmpi.w    #96,d0
  2373.     beq    width96
  2374.     IERROR    24
  2375. width64:
  2376.     moveq    #2,d1
  2377.     tas    sinitFLAG        * 512x512 にした時だけフラグセット
  2378. width96:
  2379.     move.w    d1,-(sp)
  2380.     move.w    #16,-(sp)        * 画面サイズ指定モード
  2381.     DOS    _CONCTRL
  2382.     move.l    #$000e_0000,(sp)    * console 0,31,1
  2383.     DOS    _CONCTRL
  2384.     addq.l    #4,sp
  2385.  
  2386.     bsr    init_tpal        * テキストパレット初期化
  2387.     bra    main_loop
  2388.  
  2389.  
  2390. Screen:
  2391.     bsr    int値get    * 値1:表示画面サイズ
  2392.     cmpi.w    #2,d0
  2393.     bhi    screen_mode_error
  2394.     beq    sc768
  2395.     moveq    #1,d1
  2396.     eor    d0,d1
  2397.  
  2398.     bsr    int値get    * 値2:実画面及び色モード
  2399.     cmpi.w    #3,d0
  2400.     bhi    screen_mode_error
  2401.     add.w    d0,d0
  2402.     or.w    d0,d1
  2403.     add.w    d1,d1        * 抜けてる?
  2404.  
  2405.     bsr    int値get    * 値3:ディスプレイ解像度
  2406.     subq.w    #1,d0
  2407.     beq    @f
  2408.     bhi    screen_mode_error
  2409.     addq.w    #1,d1
  2410. @@:
  2411.     bsr    int値get        * 値4:GRAPHIC表示ON/OFF
  2412.     subq.w    #1,d0
  2413.     beq    screen_g_init        * モード変更前にチェック、モード変更後に初期化
  2414.     bhi    screen_mode_error
  2415.     IOCS    _CRTMOD        * dos_call で出来ないかなぁ
  2416. screen_end:
  2417.     tas    sinitFLAG    *bset #7
  2418.     bra    main_loop
  2419.  
  2420. screen_g_init:
  2421.     bsr    check_g_use_mode
  2422.     bne    screen_g_use_error
  2423.     IOCS    _CRTMOD
  2424.     IOCS    _G_CLR_ON
  2425.     bra    screen_end
  2426.  
  2427.  
  2428. sc768:
  2429.     bsr    int値get    * 値2
  2430.     tst.w    d0
  2431.     bne    screen_mode_error
  2432.     bsr    int値get    * 値3
  2433.     subq.w    #1,d0
  2434.     tst.w    d0
  2435.     bne    screen_mode_error
  2436.     bsr    int値get    * 値4
  2437.     move.w    d0,-(sp)
  2438.     subq.w    #1,d0
  2439.     bmi    @f
  2440.     bhi    screen_mode_error
  2441.  
  2442.     bsr    check_g_use_mode
  2443.     bne    screen_g_use_error
  2444. @@
  2445.     move.w    #16,-(sp)
  2446.     DOS    _CONCTRL
  2447.     addq.l    #4,sp
  2448.     bra    screen_end
  2449.  
  2450.  
  2451. screen_mode_error:
  2452.     IERROR    71            * モードが異常
  2453. screen_g_use_error:
  2454.     IERROR    72            * グラフィック画面は使用中
  2455.  
  2456.  
  2457.  * GRAPHIC の使用状況を調べる    by Eriko    * を中谷が てきとー にいじった。
  2458. check_g_use_mode:
  2459.         move.w    d1,-(sp)
  2460.         clr.w    d1
  2461.         moveq    #-1,d2
  2462.         IOCS    _TGUSEMD
  2463.         move.w    (sp)+,d1
  2464.         tst.b    d0        * 未使用
  2465.         beq    @f
  2466.         subq.b    #3,d0        * 破壊
  2467. @@:        rts
  2468.  
  2469.  
  2470.  
  2471.  
  2472.  
  2473. ColorP:
  2474.     moveq    #0,d1    * text color
  2475.     moveq    #4-1,d3
  2476. @@:
  2477.     tst.w    (a5)+
  2478.     bne    1f
  2479.     move.w    d3,-(sp)
  2480.     bsr    int値get
  2481.     move.l    d0,d2
  2482.     IOCS    _TPALET
  2483.     move.w    (sp)+,d3
  2484. 1:
  2485.     addq.w    #1,d1
  2486.     bset    #6,sinitFLAG        * 1回でも変更したらセット
  2487.     dbra    d3,@b
  2488.     bra    main_loop
  2489.  
  2490.  
  2491. Color:
  2492.     bsr    int値get
  2493.     move.w    d0,d1
  2494.     IOCS    _B_COLOR
  2495.     bra    main_loop
  2496.  
  2497.  
  2498.  
  2499. Locate:
  2500.     bsr    int値get
  2501.     subq.l    #4,sp
  2502.     move.w    d0,(sp)        * X 座標
  2503.  
  2504.     bsr    int値get
  2505.     sub.w    scroll開始行,d0
  2506.     bcs    @f
  2507.     move.w    d0,2(sp)    * Y 座標
  2508.     move.w    #3,-(sp)
  2509.     DOS    _CONCTRL
  2510.     addq.l    #6,sp
  2511.     bra    main_loop
  2512. @@:
  2513.     IERROR    44
  2514.  
  2515. CursorSW:
  2516.     bsr    int値get
  2517.     tst.l    d0
  2518.     bne    CursorON
  2519.  
  2520.     bclr    #cursorF,d7
  2521.     beq    main_loop
  2522.     move.w    #18,-(sp)    * cursor off
  2523.     bra    @f
  2524.  
  2525. CursorON:
  2526.     bset    #cursorF,d7
  2527.     bne    main_loop
  2528.  
  2529.     move.w    #17,-(sp)    * cursor on
  2530. @@:
  2531.     DOS    _CONCTRL
  2532.     addq.l    #2,sp
  2533.     bra    main_loop
  2534.  
  2535.  
  2536.  
  2537. Beep::
  2538.     move.w    #7,-(sp)    * beep 音
  2539.     DOS    _PUTCHAR
  2540.     addq.l    #2,sp
  2541.     bra    main_loop
  2542.  
  2543.  
  2544.  
  2545. Cls:
  2546.     move.l    #$000a_0002,-(sp)    * 画面全体消去
  2547.     DOS    _CONCTRL
  2548.     addq.l    #4,sp
  2549.     bra    main_loop
  2550.  
  2551.  
  2552.  
  2553.  
  2554. inp_sub:
  2555.     tst.b    (a5)+
  2556.     bne    inp_sub
  2557.     addq.l    #1,a5
  2558.     move.l    a5,d0
  2559.     bclr    #0,d0
  2560.     movea.l    d0,a5
  2561.     rts
  2562.  
  2563.  
  2564.  
  2565.  
  2566. Input:
  2567.     move.l    a5,-(sp)
  2568. Inp_retry:
  2569.     DOS    _PRINT
  2570.     pea.l    hatena(pc)
  2571.     DOS    _PRINT
  2572.     addq.l    #4,sp
  2573.     move.l    (sp),a5
  2574.     bsr    inp_sub
  2575.  
  2576.     bsr    cursor_on
  2577.  
  2578.     lea.l    tmp,a1
  2579.     move.l    a1,-(sp)
  2580.     move.w    #$ff00,(a1)+
  2581.     DOS    _GETS
  2582.     pea.l    _crlf(pc)
  2583.     DOS    _PRINT
  2584.     addq.l    #8,sp
  2585.  
  2586.     bsr    cursor_off
  2587.     move.w    _breakflag(pc),d0
  2588.     bne    Stop
  2589.  
  2590. Inp_loop:
  2591.  
  2592.     lea.l    $100+tmp,a0
  2593.     moveq    #0,d1        * 実体あり?
  2594. iii1:
  2595.     move.b    (a1),d0
  2596.     beq    iii2
  2597.     moveq    #1,d1
  2598.     addq.l    #1,a1
  2599.     cmpi.b    #',',d0
  2600.     beq    iii2
  2601.     move.b    d0,(a0)+
  2602.     bra    iii1
  2603. iii2:
  2604.     cmpi.b    #$20,-1(a0)
  2605.     bne    iii3
  2606.     subq.l    #1,a0
  2607.     bra    iii2
  2608. iii3:
  2609.     clr.b    (a0)
  2610.     lea.l    $100+tmp,a0
  2611.  
  2612.     move.w    (a5)+,d2
  2613.     beq    Inp_int
  2614.     bmi    Inp_float
  2615.     cmpi.w    #$0100,d2
  2616.     beq    Inp_str
  2617.     cmpi.w    #$0200,d2
  2618.     beq    Inp_char
  2619.     tst.b    d1
  2620.     bne    Inp_データ多い
  2621.     addq.l    #4,sp
  2622.     bra    main_loop
  2623.  
  2624.  
  2625. Inp_str:
  2626.     move.w    (a5)+,d2
  2627.     bmi    1f
  2628.     movea.l    変数str,a2        * とりあえず兼用
  2629.     bra    2f
  2630. 1:
  2631.     not.w    d2
  2632.     movea.l    Astr(a4),a2
  2633. 2:
  2634.     lsl.w    #8,d2
  2635.     lea.l    (a2,d2.w),a2
  2636.  
  2637.     tst.b    (a0)
  2638.     beq    Inp_loop
  2639. @@:
  2640.     move.b    (a0)+,(a2)+
  2641.     bne    @b
  2642.     bra    Inp_loop
  2643.  
  2644.  
  2645. Inp_int:
  2646.     move.w    (a5)+,d2
  2647.     bmi    1f
  2648.     movea.l    変数int,a2        * とりあえず兼用
  2649.     bra    2f
  2650. 1:
  2651.     not.w    d2
  2652.     movea.l    Aint(a4),a2
  2653. 2:
  2654.     lsl.w    #2,d2
  2655.     tst.b    (a0)
  2656.     beq    Inp_loop
  2657.  
  2658.     bsr    inpget
  2659.     move.l    d0,(a2,d2.w)
  2660.     tst.b    (a0)
  2661.     beq    Inp_loop
  2662.     bra    inp型違い
  2663.  
  2664.  
  2665. Inp_char:
  2666.     move.w    (a5)+,d2
  2667.     bmi    1f
  2668.     movea.l    変数char,a2        * とりあえず兼用
  2669.     bra    2f
  2670. 1:
  2671.     not.w    d2
  2672.     movea.l    Achar(a4),a2
  2673. 2:
  2674.     tst.b    (a0)
  2675.     beq    Inp_loop
  2676.  
  2677.     bsr    inpget
  2678.     move.b    d0,(a2,d2.w)
  2679.     tst.b    (a0)
  2680.     beq    Inp_loop
  2681.     bra    inp型違い
  2682.  
  2683.  
  2684. Inp_float:
  2685.     move.w    (a5)+,d2
  2686.     bmi    1f
  2687.     movea.l    変数float,a2        * とりあえず兼用
  2688.     bra    2f
  2689. 1:
  2690.     not.w    d2
  2691.     movea.l    Afloat(a4),a2
  2692. 2:
  2693.     lsl.w    #3,d2
  2694.     tst.b    (a0)
  2695.     beq    Inp_loop
  2696.  
  2697.     movem.l    d2-d3,-(sp)
  2698.     FPACK    __VAL
  2699.     movem.l    (sp)+,d2-d3
  2700.     movem.l    d0-d1,(a2,d2.w)
  2701.     tst.b    (a0)
  2702.     beq    Inp_loop
  2703.     bra    inp型違い
  2704.  
  2705.  
  2706.  
  2707.  
  2708. Inp_データ多い:
  2709.     pea.l    _Inp_データ多い(pc)
  2710.     bra    @f
  2711. inp型違い:
  2712.     pea.l    _inp型違い(pc)
  2713. @@:
  2714.     DOS    _PRINT
  2715.     addq.l    #4,sp
  2716.     bra    Inp_retry
  2717.  
  2718. _Inp_データ多い:
  2719.     .dc.b    7,'データの個数が多いんちゃいますか',13,10,0
  2720. _inp型違い:
  2721.     .dc.b    7,'データの型が違いますねん',13,10,0
  2722. hatena:
  2723.     .dc.b    '? ',0
  2724.     .even
  2725.  
  2726.  
  2727.  
  2728.  
  2729. inpget:
  2730.     cmpi.b    #'&',(a0)
  2731.     beq    定数etc
  2732.     FPACK    __STOL
  2733.     rts
  2734.  
  2735. 定数etc:
  2736.     addq.l    #1,a0
  2737.     moveq    #$20,d0
  2738.     or.b    (a0)+,d0
  2739.     cmpi.b    #'h',d0
  2740.     beq    定数HEX
  2741.     cmpi.b    #'b',d0
  2742.     beq    定数BIN
  2743.     cmpi.b    #'o',d0
  2744.     beq    定数OCT
  2745.     addq.l    #4,sp        * 邪道
  2746.     bra    inp型違い
  2747.  
  2748. 定数BIN:
  2749.     FPACK    __STOB
  2750.     rts
  2751.  
  2752. 定数OCT:
  2753.     FPACK    __STOO
  2754.     rts
  2755.  
  2756. 定数HEX:
  2757.     FPACK    __STOH
  2758.     rts
  2759.  
  2760.  
  2761.  
  2762. Linput:
  2763.     move.l    a5,-(sp)
  2764.     DOS    _PRINT
  2765.     addq.l    #4,sp
  2766.     bsr    inp_sub
  2767.  
  2768.     bsr    cursor_on
  2769.  
  2770.     lea.l    tmp,a0
  2771.     move.l    a0,-(sp)
  2772.     move.w    #$ff00,(a0)+
  2773.     DOS    _GETS
  2774.     pea.l    _crlf(pc)
  2775.     DOS    _PRINT
  2776.     addq.l    #8,sp
  2777.  
  2778.     bsr    cursor_off
  2779.     move.w    _breakflag(pc),d0
  2780.     bne    Stop
  2781.  
  2782.     move.w    (a5)+,d2
  2783.     bmi    linput_Astr
  2784.  
  2785.     movea.l    変数str,a1        * とりあえず兼用
  2786.     bra    @f
  2787. linput_Astr:
  2788.     not.w    d2
  2789.     movea.l    Astr(a4),a1
  2790. @@:
  2791.     lsl.w    #8,d2
  2792.     lea.l    (a1,d2.w),a1
  2793.  
  2794. @@:
  2795.     move.b    (a0)+,(a1)+
  2796.     bne    @b
  2797.  
  2798.     bra    main_loop
  2799.  
  2800.  
  2801.  
  2802.  
  2803.  
  2804.  
  2805.  
  2806.  
  2807.  
  2808. print:    .macro
  2809.     .local    l1
  2810.     .local    l2
  2811.     tst.w    d7
  2812.     bge    l1
  2813.     DOS    _FPUTS
  2814.     bra    l2
  2815. l1:
  2816.     DOS    _PRINT
  2817. l2:
  2818.     .endm
  2819.  
  2820. Lprint:
  2821.     move.w    #4,-(sp)    * prn
  2822.     bset    #localF,d7
  2823.     bra    @f
  2824. Print:
  2825.     bclr    #localF,d7
  2826. @@:
  2827.     move.w    (a5)+,d4
  2828.     bge    print_ctrl
  2829.     bsr    値get
  2830.  
  2831.     tst.b    d4
  2832.     beq    int_print
  2833.     bmi    float_print
  2834.     subq.b    #1,d4
  2835.     beq    str_print
  2836. *char_print:
  2837. int_print:
  2838.     lea.l    tmp,a0
  2839.     move.l    a0,-(sp)
  2840.     move.b    #$20,(a0)+
  2841.     FPACK    __LTOS
  2842.     move.b    #$20,(a0)+
  2843.     clr.b    (a0)
  2844.     print
  2845.     addq.l    #4,sp
  2846.     bra    Print
  2847. *    move.l    d0,-(sp)
  2848. *    bsr    dec_print
  2849. *    addq.l    #4,sp
  2850. *    bra    Print
  2851.  
  2852. float_print:
  2853.     lea.l    tmp,a0
  2854.     move.l    a0,-(sp)
  2855.     move.b    #$20,(a0)+
  2856.     FPACK    __DTOS
  2857.     move.b    #$20,(a0)+
  2858.     clr.b    (a0)
  2859.     print
  2860.     addq.l    #4,sp
  2861.     bra    Print
  2862.  
  2863. str_print:
  2864.     movea.l    a0,a1
  2865.     moveq    #-1,d2
  2866.     moveq    #$20,d1
  2867.     moveq    #0,d0
  2868. ccloop:
  2869.     addq.w    #1,d2
  2870.     move.b    (a1)+,d0
  2871.     beq    ctrlcodeなし
  2872.     cmp.b    d1,d0
  2873.     bcc    ccloop
  2874.  
  2875.     add.w    d0,d0
  2876.     move.w    _cc(pc,d0.w),d0
  2877.     beq    ccloop
  2878.  
  2879.     lea.l    tmp,a1
  2880.     move.l    a1,-(sp)
  2881.     subq.w    #1,d2
  2882.     bcs    kokop3
  2883. @@:
  2884.     move.b    (a0)+,(a1)+
  2885.     dbra    d2,@b
  2886. kokop3:
  2887.     lea.l    _cc(pc,d0.w),a2
  2888. @@:
  2889.     move.b    (a2)+,(a1)+
  2890.     bne    @b
  2891.     clr.b    (a1)
  2892.     print
  2893.     addq.l    #4,sp
  2894.  
  2895.     addq.l    #1,a0
  2896.     bra    str_print
  2897. _cc:
  2898.     .dc.w    0        * 00
  2899.     .dc.w    0
  2900.     .dc.w    0
  2901.     .dc.w    0
  2902.     .dc.w    0
  2903.     .dc.w    0
  2904.     .dc.w    0
  2905.     .dc.w    0
  2906.     .dc.w    0    * 08
  2907.     .dc.w    cc_tab-_cc
  2908.     .dc.w    cc_lf-_cc
  2909.     .dc.w    cc_home-_cc    * 0b
  2910.     .dc.w    cc_clr-_cc    * 0c
  2911.     .dc.w    cc_cr-_cc
  2912.     .dc.w    0
  2913.     .dc.w    0    *cc_Rdown-_cc
  2914.     .dc.w    0    *cc_Rup-_cc
  2915.     .dc.w    0
  2916.     .dc.w    0
  2917.     .dc.w    0
  2918.     .dc.w    0
  2919.     .dc.w    0
  2920.     .dc.w    0
  2921.     .dc.w    0
  2922.     .dc.w    0    * 18
  2923.     .dc.w    0
  2924.     .dc.w    cc_Cj-_cc    * 1a
  2925.     .dc.w    cc_ESC-_cc
  2926.     .dc.w    cc_r-_cc    * 1c
  2927.     .dc.w    cc_l-_cc    * 1d
  2928.     .dc.w    cc_u-_cc    * 1e
  2929.     .dc.w    cc_d-_cc    * 1f
  2930.  
  2931. cc_tab:        .dc.b    9,0
  2932. cc_lf:        .dc.b    $a,0
  2933. cc_home:    .dc.b    $1e,0
  2934. cc_clr:        .dc.b    $1a,0
  2935. cc_cr:        .dc.b    $d,0
  2936. cc_Cj:        .dc.b    $1b,'[J',0
  2937. cc_ESC        .dc.b    $1b,0
  2938. cc_r:        .dc.b    $1b,'[C',0
  2939. cc_l:        .dc.b    $1b,'[D',0
  2940. cc_u:        .dc.b    $b,0
  2941. cc_d:        .dc.b    $1b,'[B',0
  2942. *cc_crlf:    .dc.b    $d,$a,0
  2943. *cc_Rup:    .dc.b    $1b,'[s',$1b,'[32;H',$a,$1b,'[u',$1b,'[L',0
  2944. *cc_Rdown:    .dc.b    $1b,'[L',0
  2945.     .even
  2946.  
  2947. ctrlcodeなし:
  2948.     move.l    a0,-(sp)
  2949.     print
  2950.     addq.l    #4,sp
  2951.     bra    Print
  2952.  
  2953.  
  2954.  
  2955. print_ctrl:
  2956.     move.w    _pc(pc,d4.w),d4
  2957.     jmp    _pc(pc,d4.w)
  2958. _pc:
  2959.     .dc.w    crlf_end-_pc
  2960.     .dc.w    print_end-_pc
  2961.     .dc.w    tab-_pc
  2962.     .dc.w    using_num-_pc
  2963.     .dc.w    using_str-_pc
  2964.  
  2965.  
  2966. using_str:
  2967.     bsr    str値get
  2968.     lea.l    tmp,a1
  2969.     move.l    a1,-(sp)
  2970.     move.w    (a5)+,d0
  2971. @@:
  2972.     move.b    (a0)+,(a1)+
  2973.     dbeq    d0,@b
  2974.     bne    us_str_調整いらず
  2975.     subq.l    #1,a1
  2976. @@:
  2977.     move.b    #$20,(a1)+    * 後ろ余った時の調整
  2978.     dbra    d0,@b
  2979. us_str_調整いらず:
  2980.     clr.b    (a1)
  2981.     bra    using_common
  2982.  
  2983. using_num:
  2984.     bsr    float値get
  2985.  
  2986.     lea.l    tmp,a0
  2987.     move.l    a0,-(sp)
  2988.  
  2989. *    move.w    (a5)+,d2
  2990. *    move.w    (a5)+,d3
  2991. *    move.w    (a5)+,d4
  2992. *    ext.l    d2
  2993. *    ext.l    d3
  2994. *    ext.l    d4
  2995.     movem.w    (a5)+,d2/d3/d4    *符号拡張するのでこれでOK by Eriko
  2996.     FPACK    __USING
  2997. using_common:
  2998.     print
  2999.     addq.l    #4,sp
  3000.     bra    Print
  3001.  
  3002.  
  3003. tab:
  3004.     move.w    #$9,-(sp)    * ','
  3005.     DOS    _PUTCHAR
  3006.     addq.l    #2,sp
  3007.     bra    Print
  3008.  
  3009. crlf_end:
  3010.     pea.l    _crlf(pc)
  3011.     print
  3012.     addq.l    #4,sp
  3013. print_end:
  3014.     tst.w    d7
  3015.     bge    main_loop
  3016.     addq.l    #2,sp        * prn
  3017.     bra    main_loop
  3018.  
  3019.  
  3020.  
  3021.  
  3022.  
  3023. ここまでprint:
  3024.     subq.w    #1,d2
  3025.     bcs    kokop1
  3026.     lea.l    tmp,a1
  3027.     move.l    a1,-(sp)
  3028. @@:
  3029.     move.b    (a0)+,(a1)+
  3030.     dbra    d2,@b
  3031.     clr.b    (a1)
  3032.     print
  3033.     addq.l    #4,sp
  3034. kokop1:
  3035.     addq.l    #1,a0
  3036.     rts
  3037.  
  3038.  
  3039. _crlf:
  3040.     .dc.b    13,10,0
  3041.     .even
  3042.  
  3043.  
  3044.  
  3045.  
  3046.  
  3047.  
  3048.  
  3049.  
  3050. Return:
  3051.     move.l    orgstrbuf(a4),strbuf
  3052.     move.w    (a5)+,d4
  3053.     move.w    d4,-(sp)
  3054.     bsr    値get
  3055.     lea.l    ret_dat(pc),a1
  3056.     move.w    (sp)+,d4
  3057.     beq    intRET
  3058.     tst.b    d4
  3059.     bmi    floatRET
  3060.     subq.w    #2,d4
  3061.     beq    intRET        * ほんとは char だけど
  3062. *strRET:
  3063.     move.l    a0,6(a1)
  3064.     bra    _ret
  3065.  
  3066. floatRET:
  3067.     movem.l    d0-d1,2(a1)
  3068.     bra    _ret
  3069.  
  3070. intRET:
  3071.     move.l    d0,6(a1)
  3072.     bra    _ret
  3073.  
  3074. Endfunc:
  3075.     move.l    orgstrbuf(a4),strbuf
  3076.     lea.l    no_ret_dat(pc),a1
  3077. _ret:
  3078.     movea.l    a1,a0
  3079.     movea.l    orgSP(a4),sp
  3080.     moveq    #0,d0
  3081.     rts
  3082.  
  3083.     .align    4
  3084. no_ret_dat:
  3085.     .dc.w    -1
  3086. ret_dat:
  3087.     .dc.w    0
  3088.     .dc.l    0,0
  3089.  
  3090.  
  3091.  
  3092. Stop:
  3093.     clr.b    ed_filename    * エディタ起動せず
  3094.     IERROR    54
  3095. Exit:
  3096.     bsr    int値get
  3097.     move.w    d0,EXITcode
  3098. End:
  3099.     bra    endendend
  3100.  
  3101.  
  3102.  
  3103. **    **    **    **    **    **    **    **    **
  3104.  
  3105.  
  3106.  
  3107.  
  3108.  
  3109.  
  3110.  
  3111.  
  3112.  
  3113.  
  3114. cursor_on:
  3115.     btst    #cursorF,d7
  3116.     beq    @f
  3117.     move.w    #17,-(sp)    * cursor on
  3118.     DOS    _CONCTRL
  3119.     addq.l    #2,sp
  3120. @@:
  3121.     rts
  3122.  
  3123. cursor_off:
  3124.     btst    #cursorF,d7
  3125.     beq    @f
  3126.     move.w    #18,-(sp)    * cursor off
  3127.     DOS    _CONCTRL
  3128.     addq.l    #2,sp
  3129. @@:
  3130.     rts
  3131.  
  3132.  
  3133.  
  3134.  
  3135.  
  3136.  
  3137.  
  3138.  
  3139. **    **    **    **    **    **    **    **    **
  3140.  
  3141.  
  3142.  
  3143.  
  3144.  
  3145.  
  3146.  
  3147.  * d4.b = 型
  3148.     .xdef    function_call
  3149. function_call:
  3150.     move.w    (a5)+,d2    * 引き数の個数
  3151.     move.w    d2,d0
  3152.     lsl.w    #4,d0        * いっぱい余るけどいいよね
  3153.     neg.w    d0
  3154.     lea.l    -4*(3+5)-2(sp,d0.w),sp
  3155.         *レジスタ退避+引き数の個数+引き数(10*個数)
  3156.     movea.l    sp,a1
  3157.  
  3158.     move.w    d2,(a1)+    * 引き数の個数
  3159.  
  3160.     subq.w    #1,d2
  3161.     bcs    fnc_call_loop_end
  3162. fnc_call_loop:
  3163.     move.w    (a5)+,d4
  3164.     bmi    引き数は式
  3165.     btst    #$e,d4
  3166.     bne    引き数は配列
  3167.     cmpi.b    #$ff,d4
  3168.     beq    引き数は省略
  3169.     IERROR    18
  3170.  
  3171.  
  3172. 引き数は省略:
  3173.     move.w    #$ffff,(a1)+
  3174.     addq.l    #8,a1
  3175.     bra    fnc_call_cont
  3176.  
  3177.  
  3178.  
  3179. 引き数は配列:
  3180.     btst    #$d,d4
  3181.     bne    引き数はポインタ
  3182.  
  3183.     btst    #8,d4
  3184.     bne    引き数はauto配列
  3185.  
  3186.     movea.l    配列,a0
  3187.     bra    @f
  3188. 引き数はauto配列:
  3189.     lea.l    Adim(a4),a0
  3190. @@:
  3191.     move.w    (a5)+,d0
  3192.     lsl.w    #2,d0
  3193.  
  3194.     clr.w    (a1)+            * これでいい?  調べないと
  3195.     addq.l    #4,a1
  3196.     move.l    (a0,d0.w),(a1)+
  3197.     bra    fnc_call_cont
  3198.  
  3199.  
  3200. 引き数はポインタ:
  3201.     moveq    #0,d0
  3202.     move.w    (a5)+,d0
  3203.     tst.b    d4
  3204.     beq    intPT
  3205.     bmi    floatPT
  3206.     cmpi.b    #1,d4
  3207.     bne    charPT
  3208. strPT:
  3209.     lsl.l    #8,d0
  3210.     btst    #8,d4
  3211.     bne    strPTA
  3212.     movea.l    変数str,a0
  3213.     bra    @f
  3214. strPTA:
  3215.     movea.l    Astr(a4),a0
  3216.     bra    @f
  3217.  
  3218. charPT:
  3219.     btst    #8,d4
  3220.     bne    charPTA
  3221.     movea.l    変数char,a0
  3222.     bra    @f
  3223. charPTA:
  3224.     movea.l    Achar(a4),a0
  3225.     bra    @f
  3226.  
  3227. floatPT:
  3228.     lsl.l    #3,d0
  3229.     btst    #8,d4
  3230.     bne    floatPTA
  3231.     movea.l    変数float,a0
  3232.     bra    @f
  3233. floatPTA:
  3234.     movea.l    Afloat(a4),a0
  3235.     bra    @f
  3236.  
  3237. intPT:
  3238.     lsl.l    #2,d0
  3239.     btst    #8,d4
  3240.     bne    intPTA
  3241.     movea.l    変数int,a0
  3242.     bra    @f
  3243. intPTA
  3244.     movea.l    Aint(a4),a0
  3245.  
  3246. @@:
  3247.     adda.l    d0,a0
  3248.     clr.w    (a1)+            * これでいい?  調べないと
  3249.     addq.l    #4,a1
  3250.     move.l    a0,(a1)+
  3251.  
  3252.     bra    fnc_call_cont
  3253.  
  3254.  
  3255.  
  3256. 引き数は式:
  3257.     tst.b    d4
  3258.     beq    intP
  3259.     bmi    floatP
  3260.     subq.b    #1,d4
  3261.     bne    charP        * char
  3262. strP:
  3263.     moveq    #1,d4
  3264.     move.w    d2,-(sp)
  3265.     bsr    値get
  3266.     move.w    (sp)+,d2
  3267.  
  3268.     move.w    #3,(a1)+    * str
  3269.     addq.l    #4,a1
  3270. *    clr.l    (a1)+
  3271.     move.l    a0,(a1)+
  3272.     bra    fnc_call_cont
  3273. charP:        * char
  3274.     move.w    #2,(a1)+    * char
  3275.     bra    @f
  3276. floatP:
  3277.     move.w    d2,-(sp)
  3278.     bsr    値get
  3279.     move.w    (sp)+,d2
  3280.     clr.w    (a1)+        * float
  3281.     move.l    d0,(a1)+
  3282.     move.l    d1,(a1)+
  3283.     bra    fnc_call_cont
  3284. intP:
  3285.     move.w    #1,(a1)+    * int
  3286. @@:
  3287.     move.w    d2,-(sp)
  3288.     bsr    int値get
  3289.     move.w    (sp)+,d2
  3290.     addq.l    #4,a1
  3291. *    clr.l    (a1)+
  3292.     move.l    d0,(a1)+
  3293.  
  3294.  
  3295. fnc_call_cont:
  3296.     dbra    d2,fnc_call_loop
  3297. fnc_call_loop_end:
  3298.     move.w    (a5)+,d0            * 関数番号
  3299.     bmi    内部関数呼出
  3300.     lsl.w    #4,d0
  3301.     movea.l    関数buf,a0
  3302.     movea.l    $c(a0,d0.w),a0        * 関数実行アドレス
  3303.  
  3304.     move.w    (sp),d2        * 引き数の個数
  3305.     lsl.w    #4,d2        * いっぱい余るけどいいよね
  3306.     movem.l    d5-d7/a2-a6,2(sp,d2.w)
  3307.     jsr    (a0)                * 関数呼び出し
  3308.     move.w    (sp),d2        * 引き数の個数
  3309.     lsl.w    #4,d2        * いっぱい余るけどいいよね
  3310.     lea.l    2(sp,d2.w),sp
  3311.     movem.l    (sp)+,d5-d7/a2-a6
  3312.  
  3313.     move.l    d0,errorno
  3314.     beq    無事実行
  3315.     lea.l    dummy_fac(pc),a0    * 返り値を用意していない関数用?
  3316.     btst    #errorF,d7
  3317.     bne    無事実行    * error off
  3318.  
  3319.     .xref    最左カラム
  3320.     bsr    最左カラム
  3321.     move.l    a1,-(sp)
  3322.     DOS    _PRINT
  3323.     IERROR    20
  3324.  
  3325. 無事実行:
  3326.     rts
  3327.  
  3328. dummy_fac:
  3329.     .dc.w    0
  3330.     .dc.l    0,-1        * error の時の返り値
  3331.  
  3332.  
  3333. 内部関数呼出:
  3334.     not.w    d0
  3335.  
  3336.     lsl.w    #4,d0
  3337.     movea.l    内部関数buf,a0
  3338.     movea.l    変数area,a2        * 保存
  3339.  
  3340.     move.w    (sp),d2        * 引き数の個数
  3341.     lsl.w    #4,d2        * いっぱい余るけどいいよね
  3342.     movem.l    d5-d7/a2-a6,2(sp,d2.w)
  3343.  
  3344.     movea.l    $c(a0,d0.w),a5        * 関数実行アドレス
  3345.     move.l    a5,d0
  3346.     beq    内部関数のアドレスなし
  3347.     bset    #modeF,d7        * 内部関数フラグセット
  3348.     bsr    basic_exec            * 関数呼び出し
  3349.  
  3350.     move.w    (sp),d2        * 引き数の個数
  3351.     lsl.w    #4,d2        * いっぱい余るけどいいよね
  3352.     lea.l    2(sp,d2.w),sp
  3353.     movem.l    (sp)+,d5-d7/a2-a6
  3354.  
  3355.     move.l    a2,変数area        * 復活
  3356.     rts
  3357.  
  3358.  
  3359.     .xdef    内部関数のアドレスなし
  3360. 内部関数のアドレスなし:
  3361.     IERROR    2
  3362.  
  3363.  
  3364.  
  3365.  
  3366.  
  3367.  
  3368.  
  3369.  
  3370.  
  3371.  
  3372.  
  3373.  
  3374.  
  3375.  
  3376.  
  3377.  
  3378.  
  3379.  
  3380.  
  3381. **    **    **    **    **    **    **    **
  3382.  
  3383.  
  3384.  
  3385.  
  3386.  
  3387.  
  3388.  
  3389.  
  3390.     .offset    4
  3391. Fint:    .ds.l    1
  3392. Fstr:    .ds.l    1
  3393. Fchar:    .ds.l    1
  3394. Ffloat:    .ds.l    1
  3395. Fdim:    .ds.l    1
  3396. F引数:    .ds.l    1
  3397.     .text
  3398.  
  3399. Variable_clr_sub:
  3400. *    move.w    (a5)+,d0
  3401. *    movea.l    4+変数INIT,a0
  3402. *    adda.w    d0,a0
  3403.  
  3404.     movea.l    変数area,a1
  3405.     move.l    (a0)+,d0
  3406.     lea.l    (a1,d0.l),a2
  3407.     cmpa.l    mem_last,a2
  3408.     bcc    mem_err
  3409.  
  3410.     btst    #v_initF,d7
  3411.     beq    1f
  3412.  
  3413.         movea.l    Fint(sp),a2
  3414.         move.l    a1,(a2)
  3415.         move.w    (a0)+,d0    * int
  3416.         addq.w    #1,d0
  3417.         lsl.w    #2,d0
  3418.         adda.w    d0,a1
  3419.  
  3420.         movea.l    Fstr(sp),a2
  3421.         move.l    a1,(a2)
  3422.         move.w    (a0)+,d0    * str
  3423.         addq.w    #1,d0
  3424.         lsl.w    #8,d0        * 128 個までしかできないけど大丈夫?
  3425.         adda.w    d0,a1
  3426.  
  3427.         movea.l    Fchar(sp),a2
  3428.         move.l    a1,(a2)
  3429.         move.w    (a0)+,d0    * char
  3430.         addq.w    #1+3,d0
  3431.         andi.w    #$fffc,d0
  3432.         adda.w    d0,a1
  3433.  
  3434.         movea.l    Ffloat(sp),a2
  3435.         move.l    a1,(a2)
  3436.         move.w    (a0)+,d0    * float
  3437.         addq.w    #1,d0
  3438.         lsl.w    #2,d0
  3439.         adda.w    d0,a1
  3440.  
  3441.         bra    @f
  3442.  
  3443. 1:
  3444.     moveq    #0,d1
  3445.  
  3446.         movea.l    Fint(sp),a2
  3447.         move.l    a1,(a2)
  3448.         move.w    (a0)+,d0    * int
  3449.         addq.w    #1,d0
  3450.         bsr    a1_clr_d0x4
  3451.  
  3452.         movea.l    Fstr(sp),a2
  3453.         move.l    a1,(a2)
  3454.         move.w    (a0)+,d0    * str
  3455.         addq.w    #1,d0
  3456.         lsl.w    #8-2,d0
  3457.         bsr    a1_clr_d0x4
  3458.  
  3459.         movea.l    Fchar(sp),a2
  3460.         move.l    a1,(a2)
  3461.         move.w    (a0)+,d0    * char
  3462.         addq.w    #1+3,d0
  3463.         lsr.w    #2,d0
  3464.         bsr    a1_clr_d0x4
  3465.  
  3466.         movea.l    Ffloat(sp),a2
  3467.         move.l    a1,(a2)
  3468.         move.w    (a0)+,d0    * float
  3469.         addq.w    #1,d0
  3470.         add.w    d0,d0
  3471.         bsr    a1_clr_d0x4
  3472.  
  3473. @@:
  3474.  
  3475.  
  3476. 配列初期:
  3477.     movea.l    Fdim(sp),a2
  3478.     move.w    (a0)+,d4        * 配列の個数 - 1
  3479.     bmi    配列初期end
  3480.  
  3481. 配列初期loop:
  3482.     moveq    #0,d3
  3483.     move.b    (a0)+,d3    * 次元 - 1
  3484.     move.b    (a0)+,d1    * 型
  3485.  
  3486.     btst    #0,d3
  3487.     bne    @f        * 奇数次元の時に
  3488.     addq.l    #2,a1        * 配列の要素がロングワード境界に来るように小細工
  3489. @@:
  3490.  
  3491.     move.l    a1,(a2)+    * 配列ポインタ
  3492.  
  3493.     clr.l    (a1)+        * offset (無効)
  3494.     move.w    d3,(a1)+        * 次元
  3495.  
  3496.         bsr    dim_clr_sub1
  3497.  
  3498.     move.w    d3,d1        * 次元 - 1
  3499. @@:
  3500.     move.w    (a0)+,(a1)+    * 添え字の大きさ
  3501.     dbra    d1,@b
  3502.  
  3503.  
  3504.         bsr    dim_clr_sub2
  3505.  
  3506.     btst    #v_initF,d7
  3507.     beq    1f
  3508.     andi.b    #$fc,d0
  3509.     adda.l    d0,a1
  3510.     bra    配列初期cont
  3511.  
  3512. 1:
  3513.     lsr.l    #2,d0
  3514.     moveq    #0,d1
  3515.     bsr    a1_clr_d0Lx4
  3516.  
  3517.  
  3518. 配列初期cont:
  3519.     dbra    d4,配列初期loop
  3520.  
  3521. 配列初期end:
  3522.     move.l    a1,変数area
  3523.  
  3524.  
  3525.  
  3526. **    **    **    **
  3527.  
  3528.  * 引き数のセット
  3529.     movea.l    4+引数INIT,a0
  3530.     adda.w    (a5)+,a0    * 引き数リストの先頭アドレス
  3531.  
  3532.     move.w    (a0)+,d3    * 引き数個数 - 1
  3533.     bmi    引き数setend
  3534.  
  3535.     movea.l    F引数(sp),a1
  3536.     addq.l    #4+2,a1        * stack に積んである引き数の先頭
  3537. 引き数setloop:
  3538.     move.w    (a0)+,d0    * 型
  3539.     bmi    @f
  3540.         move.w    (a0)+,d2    * 配列番号
  3541.         movea.l    Fdim(sp),a2
  3542.         lsl.w    #2,d2
  3543.         move.l    6(a1),(a2,d2.w)    * 配列ポインタ
  3544.         bra    引き数setcont
  3545. @@:
  3546.     move.w    (a0)+,d2    * 番号
  3547.  
  3548.     tst.b    d0
  3549.     beq    int引数
  3550.     bmi    float引数
  3551.     subq.b    #1,d0
  3552.     beq    str引数
  3553.  * char
  3554.     movea.l    Fchar(sp),a2
  3555.     movea.l    (a2),a2
  3556.     move.b    6+3(a1),(a2,d2.w)
  3557.     bra    引き数setcont
  3558.  
  3559.  
  3560. str引数:
  3561.     movea.l    Fstr(sp),a2
  3562.     lsl.w    #8,d2
  3563.     movea.l    (a2),a2
  3564.     lea.l    (a2,d2.w),a2
  3565.     move.l    a0,-(sp)
  3566.     movea.l    6(a1),a0
  3567. @@:
  3568.     move.b    (a0)+,(a2)+
  3569.     bne    @b
  3570.     move.l    (sp)+,a0
  3571.     bra    引き数setcont
  3572.  
  3573. float引数:
  3574.     movea.l    Ffloat(sp),a2
  3575.     lsl.w    #3,d2
  3576.     movea.l    (a2),a2
  3577.     move.l    2(a1),(a2,d2.w)
  3578.     move.l    6(a1),4(a2,d2.w)
  3579.     bra    引き数setcont
  3580.  
  3581. int引数:
  3582.     movea.l    Fint(sp),a2
  3583.     lsl.w    #2,d2
  3584.     movea.l    (a2),a2
  3585.     move.l    6(a1),(a2,d2.w)
  3586.  
  3587. 引き数setcont:
  3588.     lea.l    10(a1),a1
  3589.     dbra    d3,引き数setloop
  3590.  
  3591. 引き数setend:
  3592.     rts
  3593.  
  3594.  
  3595.  
  3596.  
  3597.  
  3598. dim_clr_sub1:
  3599.     moveq    #4,d0        * 各項のデータサイズを見る
  3600.     moveq    #2,d2        * size (shift)
  3601.     tst.b    d1        * 型
  3602.     beq    1f
  3603.     bmi    2f    * float
  3604.     subq.b    #1,d1
  3605.     beq    3f    * str
  3606.  
  3607.     moveq    #1,d0        * char
  3608.     moveq    #0,d2
  3609.     bra    1f
  3610. 3:
  3611.     move.w    #$100,d0    * str
  3612.     moveq    #8,d2
  3613.     bra    1f
  3614. 2:
  3615.     moveq    #8,d0        * float
  3616.     moveq    #3,d2
  3617. 1:
  3618.     move.w    d0,(a1)+    * 各項のデータサイズ(1 or 4 or 8 or 256)
  3619.     rts
  3620.  
  3621.  
  3622. dim_clr_sub2:
  3623.     move.w    d3,d1        * 次元 - 1
  3624.     lsl.w    #2,d1
  3625.     lea.l    (a1,d1.w),a3
  3626.     move.l    a3,-(sp)
  3627.  
  3628.     moveq    #1,d0
  3629.     bra    1f
  3630. @@:
  3631.     move.l    d0,-(a3)    * 配列計算用のオフセット
  3632. 1:
  3633.     moveq    #0,d1
  3634.     move.w    -(a1),d1
  3635.     addq.l    #1,d1
  3636.     FPACK    __UMUL
  3637.     dbra    d3,@b
  3638.  
  3639.     movea.l    (sp)+,a1
  3640.  
  3641.     lsl.l    d2,d0
  3642.     addq.l    #3,d0        * 忘れてた
  3643.     rts
  3644.  
  3645.  
  3646.  
  3647.  
  3648. a1_clr_d0Lx4:
  3649.     subq.l    #1,d0
  3650.     bmi    a1_clr_d0x4_end
  3651. @@:
  3652.     move.l    d1,(a1)+
  3653.     dbra    d0,@b
  3654.     clr.w    d0
  3655.     subq.l    #1,d0
  3656.     bcc    @b
  3657.     rts
  3658.  
  3659.  
  3660. a1_clr_d0x4:
  3661.     subq.w    #1,d0
  3662.     bmi    a1_clr_d0x4_end
  3663. @@:
  3664.     move.l    d1,(a1)+
  3665.     dbra    d0,@b
  3666. a1_clr_d0x4_end:
  3667.     rts
  3668.  
  3669.  
  3670. mem_err:
  3671.     IERROR    1
  3672.  
  3673.  
  3674.  
  3675.     .end
  3676.  
  3677.